{
  "components": {
    "schemas": {
      "APIKeyCountSchema": {
        "properties": {
          "count": {
            "description": "The number of API keys for the organization.",
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "APIKeyCountSchema",
        "type": "object"
      },
      "APIKeyCreateSchema": {
        "properties": {
          "expire_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The date and time when the API key will expire. If not provided, the API key will never expire.",
            "title": "Expire At"
          },
          "name": {
            "description": "The unique name of the API key.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "scope": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/APIKeyScope"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the key may do. Defaults to the most the workspace's plan allows: write on a paid plan, read on the free plan."
          }
        },
        "required": [
          "name"
        ],
        "title": "APIKeyCreateSchema",
        "type": "object"
      },
      "APIKeyCreatedSchema": {
        "description": "A key the moment it is made: the only response that carries the secret.\n\nIts own schema rather than a nullable field on ``APIKeyReadSchema``, so no read\nroute can grow a path that serves the value back by accident.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The user ID of the person who made the key, or null for a key made before makers were kept. Its maker or a workspace admin can rename or delete it.",
            "title": "Created By"
          },
          "expire_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expire At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "key": {
            "description": "The key's value. Shown here and nowhere else, ever: only a hash is stored. Copy it now; a lost key has to be replaced.",
            "title": "Key",
            "type": "string"
          },
          "key_prefix": {
            "description": "The first characters of the key's value, so it can be told apart from another in a list. The value itself is shown once, when the key is created, and is not recoverable afterwards.",
            "title": "Key Prefix",
            "type": "string"
          },
          "last_used_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this key last authenticated a request, to the minute.",
            "title": "Last Used At"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "org_id": {
            "title": "Org Id",
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/APIKeyRole",
            "description": "Whose reach the key has. A key made by a workspace admin acts as an admin; one made by a member acts as a member, and is refused what a member is refused, such as changing the plan."
          },
          "scope": {
            "$ref": "#/components/schemas/APIKeyScope",
            "description": "What the key may do. A read key may call read endpoints only; a write key may call everything the workspace's plan allows."
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "org_id",
          "name",
          "scope",
          "role",
          "created_by",
          "key_prefix",
          "created_at",
          "updated_at",
          "key"
        ],
        "title": "APIKeyCreatedSchema",
        "type": "object"
      },
      "APIKeyReadSchema": {
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The user ID of the person who made the key, or null for a key made before makers were kept. Its maker or a workspace admin can rename or delete it.",
            "title": "Created By"
          },
          "expire_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expire At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "key_prefix": {
            "description": "The first characters of the key's value, so it can be told apart from another in a list. The value itself is shown once, when the key is created, and is not recoverable afterwards.",
            "title": "Key Prefix",
            "type": "string"
          },
          "last_used_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this key last authenticated a request, to the minute.",
            "title": "Last Used At"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "org_id": {
            "title": "Org Id",
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/APIKeyRole",
            "description": "Whose reach the key has. A key made by a workspace admin acts as an admin; one made by a member acts as a member, and is refused what a member is refused, such as changing the plan."
          },
          "scope": {
            "$ref": "#/components/schemas/APIKeyScope",
            "description": "What the key may do. A read key may call read endpoints only; a write key may call everything the workspace's plan allows."
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "org_id",
          "name",
          "scope",
          "role",
          "created_by",
          "key_prefix",
          "created_at",
          "updated_at"
        ],
        "title": "APIKeyReadSchema",
        "type": "object"
      },
      "APIKeyRole": {
        "description": "Whose reach a key has: the role its requests carry in the workspace (2026-11-06).\n\nA key never does more than the person who made it may do. A key made by a\nworkspace admin acts as an admin, one made by a member acts as a member, so\nan admin-only route (changing the plan, buying credits, opening billing)\nrefuses a member's key exactly as it refuses the member. Every key made\nbefore this existed was an admin's reach, and keeps it.",
        "enum": [
          "admin",
          "member"
        ],
        "title": "APIKeyRole",
        "type": "string"
      },
      "APIKeyScope": {
        "description": "What a key may do.\n\nTwo values, not a permission matrix. The thing worth stopping is a write\nnobody watched: a leaked read key exposes\nwhat the dashboard already shows the holder, a leaked write key spends\ncredits and sends mail. A free workspace may only mint ``READ``.",
        "enum": [
          "read",
          "write"
        ],
        "title": "APIKeyScope",
        "type": "string"
      },
      "APIKeyScopeReadSchema": {
        "description": "A scope this workspace's plan lets it mint, for the create form.",
        "properties": {
          "scope": {
            "$ref": "#/components/schemas/APIKeyScope",
            "description": "A scope on offer. A workspace that does not pay gets read only."
          }
        },
        "required": [
          "scope"
        ],
        "title": "APIKeyScopeReadSchema",
        "type": "object"
      },
      "APIKeyUpdateSchema": {
        "properties": {
          "expire_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The date and time when the API key will expire. If not provided, the API key will never expire.",
            "title": "Expire At"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "description": "The unique name of the API key.",
            "title": "Name"
          }
        },
        "title": "APIKeyUpdateSchema",
        "type": "object"
      },
      "AccountActivityFilter": {
        "description": "Which accounts the list shows.",
        "enum": [
          "with_activity",
          "all"
        ],
        "title": "AccountActivityFilter",
        "type": "string"
      },
      "AccountBudgetCandidateReadSchema": {
        "description": "One person the draft thinks may hold the budget.",
        "properties": {
          "person_id": {
            "format": "uuid",
            "title": "Person Id",
            "type": "string"
          },
          "reason": {
            "title": "Reason",
            "type": "string"
          }
        },
        "required": [
          "person_id",
          "reason"
        ],
        "title": "AccountBudgetCandidateReadSchema",
        "type": "object"
      },
      "AccountCellReadSchema": {
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "title": "Column Name",
            "type": "string"
          },
          "value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value"
          }
        },
        "required": [
          "column_id",
          "column_name",
          "value"
        ],
        "title": "AccountCellReadSchema",
        "type": "object"
      },
      "AccountChartChangeReadSchema": {
        "description": "One change a rep made on the chart.",
        "properties": {
          "after": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What it became, in the same words as before.",
            "title": "After"
          },
          "after_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "With field manager: the manager's name after.",
            "title": "After Name"
          },
          "at": {
            "format": "date-time",
            "title": "At",
            "type": "string"
          },
          "before": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What it was: a manager's person key or top, or a role. For hidden, false when shown, else why they were hidden (left, wrong_person, not_relevant), or true when no reason was given. For guess, the guessed manager's key or top on one side and wrong on the other: called wrong (after wrong), or that taken back (before wrong).",
            "title": "Before"
          },
          "before_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "With field manager: the manager's name before, when there was one.",
            "title": "Before Name"
          },
          "field": {
            "$ref": "#/components/schemas/AccountChartField"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "person_key": {
            "title": "Person Key",
            "type": "string"
          },
          "person_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The person's name when the change was made.",
            "title": "Person Name"
          },
          "user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "User Id"
          }
        },
        "required": [
          "id",
          "person_key",
          "field",
          "before",
          "after",
          "user_id",
          "at",
          "person_name",
          "before_name",
          "after_name"
        ],
        "title": "AccountChartChangeReadSchema",
        "type": "object"
      },
      "AccountChartDraftReadSchema": {
        "description": "What an ask for the free draft did, and the chart after it.",
        "properties": {
          "changed_person_ids": {
            "description": "Each person whose line this draft drew new or moved, most senior first. Empty when it changed nothing, and for a reused draft.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Changed Person Ids",
            "type": "array"
          },
          "chart": {
            "$ref": "#/components/schemas/AccountOrgChartSchema"
          },
          "dropped_person_ids": {
            "description": "Each person whose drafted line this draft took away: the draft guessed no line for them this time, or one a person had called wrong.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Dropped Person Ids",
            "type": "array"
          },
          "outcome": {
            "$ref": "#/components/schemas/AccountDraftOutcome",
            "description": "drafted; reused (the people had not changed, nothing was asked); capped (no free drafts left); failed (try again)."
          }
        },
        "required": [
          "outcome",
          "chart"
        ],
        "title": "AccountChartDraftReadSchema",
        "type": "object"
      },
      "AccountChartField": {
        "description": "What a rep changed on one person of the chart.",
        "enum": [
          "manager",
          "role",
          "hidden",
          "guess"
        ],
        "title": "AccountChartField",
        "type": "string"
      },
      "AccountChartLineReadSchema": {
        "description": "One reporting line, and where it came from.",
        "properties": {
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column that states it, for a table's line.",
            "title": "Column Id"
          },
          "confidence": {
            "$ref": "#/components/schemas/AccountLineConfidence",
            "description": "Confirmed when a source states it; likely when the draft guessed it."
          },
          "loops": {
            "default": false,
            "description": "On a line not drawn: drawing it would close a loop, so the chart leaves it out. The chart's loops name each one a person has not decided.",
            "title": "Loops",
            "type": "boolean"
          },
          "manager_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The manager's person id; None at the top of the chart, or for a manager not on this account.",
            "title": "Manager Id"
          },
          "manager_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A manager not on this account, as the source wrote them.",
            "title": "Manager Name"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The draft's reason, for a likely line.",
            "title": "Reason"
          },
          "set_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "With a rep's line: when it was set.",
            "title": "Set At"
          },
          "set_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "With a rep's line: who set it.",
            "title": "Set By User Id"
          },
          "source": {
            "$ref": "#/components/schemas/AccountLineSource",
            "description": "Who gave it: a rep, a table's manager column, the Person researcher, or the free draft."
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table that states it, for a table's line.",
            "title": "Table Id"
          }
        },
        "required": [
          "source",
          "confidence",
          "manager_id",
          "manager_name",
          "reason",
          "table_id",
          "column_id",
          "set_by_user_id",
          "set_at"
        ],
        "title": "AccountChartLineReadSchema",
        "type": "object"
      },
      "AccountChartLoopReadSchema": {
        "description": "Lines the sources state that loop back on themselves, for a person to pick from.",
        "properties": {
          "steps": {
            "description": "The loop's lines in turn, each manager the next one's person, the last back to the first. The chart draws every line but the first.",
            "items": {
              "$ref": "#/components/schemas/AccountChartLoopStepReadSchema"
            },
            "title": "Steps",
            "type": "array"
          }
        },
        "required": [
          "steps"
        ],
        "title": "AccountChartLoopReadSchema",
        "type": "object"
      },
      "AccountChartLoopStepReadSchema": {
        "description": "One line of a loop: a person, and the manager a source says they report to.",
        "properties": {
          "manager_id": {
            "format": "uuid",
            "title": "Manager Id",
            "type": "string"
          },
          "manager_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Manager Name"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "person_id": {
            "format": "uuid",
            "title": "Person Id",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/AccountLineSource",
            "description": "Who states the line."
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table that states it, for a table's line.",
            "title": "Table Id"
          },
          "table_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "That table's name.",
            "title": "Table Name"
          }
        },
        "required": [
          "person_id",
          "name",
          "manager_id",
          "manager_name",
          "source",
          "table_id",
          "table_name"
        ],
        "title": "AccountChartLoopStepReadSchema",
        "type": "object"
      },
      "AccountChartLossCause": {
        "description": "Why someone a rep placed is no longer on the account.",
        "enum": [
          "moved",
          "table_off",
          "table_trashed",
          "replaced",
          "row_deleted",
          "not_found"
        ],
        "title": "AccountChartLossCause",
        "type": "string"
      },
      "AccountChartLossKind": {
        "description": "Whom a rep's word on the chart lost: the person it was about, or the manager it named.",
        "enum": [
          "person",
          "manager"
        ],
        "title": "AccountChartLossKind",
        "type": "string"
      },
      "AccountChartLossReadSchema": {
        "description": "A rep's word on the chart that lost its person: what it said, and where they are now.",
        "properties": {
          "can_return": {
            "description": "Whether what was set comes back if a row names them here again.",
            "title": "Can Return",
            "type": "boolean"
          },
          "cause": {
            "$ref": "#/components/schemas/AccountChartLossCause",
            "description": "moved: their row now names another company (now_at_key, when it is found); table_off: their table no longer feeds Accounts; table_trashed: their table is in the Trash; replaced: their row is still here but names someone else now; row_deleted: their row is gone; not_found: no row puts them here, and none was kept to say why."
          },
          "kind": {
            "$ref": "#/components/schemas/AccountChartLossKind",
            "description": "person: the person a rep gave a role or a line to is no longer at the account. manager: the manager a rep said someone reports to is no longer at the account; their line falls back to the chart's own sources meanwhile."
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their name when the rep set it, if known.",
            "title": "Name"
          },
          "now_at_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "With moved: the account their rows put them at.",
            "title": "Now At Key"
          },
          "now_at_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "That account's name.",
            "title": "Now At Name"
          },
          "person_key": {
            "description": "The person who is gone, as forget takes them.",
            "title": "Person Key",
            "type": "string"
          },
          "role": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountPersonRole"
              },
              {
                "type": "null"
              }
            ],
            "description": "The part the rep said they play, with kind person."
          },
          "subject_person_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "With kind manager: the person on the chart whose line named them.",
            "title": "Subject Person Id"
          }
        },
        "required": [
          "kind",
          "person_key",
          "name",
          "role",
          "subject_person_id",
          "cause",
          "now_at_key",
          "now_at_name",
          "can_return"
        ],
        "title": "AccountChartLossReadSchema",
        "type": "object"
      },
      "AccountChartPersonReadSchema": {
        "description": "One person on the chart, the line drawn for them, and what reps set.",
        "properties": {
          "edited_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Edited At"
          },
          "edited_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Edited By User Id"
          },
          "hidden": {
            "description": "Whether a rep hid them from the chart.",
            "title": "Hidden",
            "type": "boolean"
          },
          "hidden_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountHiddenReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "With hidden: why. left: they left the company; wrong_person: the row is not someone at this company; not_relevant: here, but not part of the deal. Null when shown, or when no reason was given."
          },
          "line": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountChartLineReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The line drawn; None when no source gives one."
          },
          "other_lines": {
            "description": "What weaker sources say, where they name a different manager.",
            "items": {
              "$ref": "#/components/schemas/AccountChartLineReadSchema"
            },
            "title": "Other Lines",
            "type": "array"
          },
          "person": {
            "$ref": "#/components/schemas/AccountPersonReadSchema"
          },
          "role": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountPersonRole"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their part in a deal, as a rep set it."
          },
          "role_set_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the role was set.",
            "title": "Role Set At"
          },
          "role_set_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who set the role, when one is set.",
            "title": "Role Set By User Id"
          }
        },
        "required": [
          "person",
          "line",
          "other_lines",
          "role",
          "hidden",
          "edited_by_user_id",
          "edited_at",
          "role_set_by_user_id",
          "role_set_at"
        ],
        "title": "AccountChartPersonReadSchema",
        "type": "object"
      },
      "AccountChartWindowReadSchema": {
        "description": "The part of a chart sent when only part was asked for (``levels``).",
        "properties": {
          "focus_path": {
            "description": "With focus: the way down to them, from the top of their tree.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Focus Path",
            "type": "array"
          },
          "loose_count": {
            "description": "People with no line either way: no manager, no reports.",
            "title": "Loose Count",
            "type": "integer"
          },
          "loose_shown": {
            "description": "How many of those are drawn.",
            "title": "Loose Shown",
            "type": "integer"
          },
          "reports": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "How many report to each drawn person, drawn or not, for each who has any.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Reports",
            "type": "object"
          },
          "shown": {
            "description": "The people drawn, top down. people also holds the ones the page names elsewhere: the hidden, role holders, the draft's candidates, a lost line's subject.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Shown",
            "type": "array"
          },
          "top_count": {
            "description": "People at the top of a tree: no manager, some reports.",
            "title": "Top Count",
            "type": "integer"
          },
          "top_shown": {
            "description": "How many of those are drawn.",
            "title": "Top Shown",
            "type": "integer"
          },
          "visible_count": {
            "description": "Everyone on the chart who is not hidden.",
            "title": "Visible Count",
            "type": "integer"
          }
        },
        "required": [
          "shown",
          "reports",
          "visible_count",
          "loose_count",
          "loose_shown",
          "top_count",
          "top_shown",
          "focus_path"
        ],
        "title": "AccountChartWindowReadSchema",
        "type": "object"
      },
      "AccountColumnEvidence": {
        "description": "How a column's role was known, strongest first.\n\nA lead search's own columns and a person's choice are known for certain; an\nenrichment's outputs are what the catalog declares; values are read from a\nsample of the column's cells; a label is used for display columns only.",
        "enum": [
          "chosen",
          "structural",
          "enrichment",
          "values",
          "label"
        ],
        "title": "AccountColumnEvidence",
        "type": "string"
      },
      "AccountColumnRole": {
        "description": "What a column of a linked table is read as.",
        "enum": [
          "website",
          "company_page",
          "email",
          "profile",
          "name",
          "first_name",
          "last_name",
          "title",
          "company_name",
          "manager"
        ],
        "title": "AccountColumnRole",
        "type": "string"
      },
      "AccountCountSchema": {
        "properties": {
          "accounts_so_far": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Every account in the workspace so far, whatever the filters; null once built.",
            "title": "Accounts So Far"
          },
          "building": {
            "description": "Whether the workspace's accounts are still being built from its tables.",
            "title": "Building",
            "type": "boolean"
          },
          "count": {
            "title": "Count",
            "type": "integer"
          },
          "indexing_tables": {
            "description": "Tables whose index has work left: changes waiting to be read, or a first index. 0 while building means the workspace's tables are still being looked through.",
            "title": "Indexing Tables",
            "type": "integer"
          }
        },
        "required": [
          "count",
          "building",
          "indexing_tables",
          "accounts_so_far"
        ],
        "title": "AccountCountSchema",
        "type": "object"
      },
      "AccountCrmRecordReadSchema": {
        "description": "The account's own company record in a connected CRM: its link and its owner.",
        "properties": {
          "has_owner": {
            "description": "Whether the record names an owner.",
            "title": "Has Owner",
            "type": "boolean"
          },
          "owner_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Owner Email"
          },
          "owner_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The owner, once the CRM said who that is.",
            "title": "Owner Name"
          },
          "record_id": {
            "description": "Its row in that table.",
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "table_id": {
            "description": "The table the record was imported into.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "tool_name": {
            "description": "The CRM, as the integrations page names it.",
            "title": "Tool Name",
            "type": "string"
          },
          "url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The record in the CRM; null until an import saved what links are built from.",
            "title": "Url"
          }
        },
        "required": [
          "table_id",
          "record_id",
          "tool_name",
          "url",
          "has_owner",
          "owner_name",
          "owner_email"
        ],
        "title": "AccountCrmRecordReadSchema",
        "type": "object"
      },
      "AccountDepartment": {
        "description": "The part of a company a person's title names (review AC-12). None: it names none.\n\nRead off the title's words by a fixed rule (``org_chart.title_department``).",
        "enum": [
          "sales",
          "marketing",
          "customer_success",
          "product",
          "design",
          "engineering",
          "data",
          "it",
          "security",
          "finance",
          "people",
          "operations",
          "legal"
        ],
        "title": "AccountDepartment",
        "type": "string"
      },
      "AccountDetailReadSchema": {
        "description": "One account as its page reads it: its list row, and every merge into it.",
        "properties": {
          "bounced_count": {
            "description": "People here an email bounced from.",
            "title": "Bounced Count",
            "type": "integer"
          },
          "company_row_count": {
            "description": "How many company rows sit on it.",
            "title": "Company Row Count",
            "type": "integer"
          },
          "domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Domain"
          },
          "employee_count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The headcount as a number the list sorts by: a range's low end.",
            "title": "Employee Count"
          },
          "employees": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's headcount as its page shows it: 35,000, or a range like 51-200.",
            "title": "Employees"
          },
          "has_activity": {
            "description": "Whether anybody here was enrolled in a sequence or has a conversation.",
            "title": "Has Activity",
            "type": "boolean"
          },
          "id": {
            "description": "The account's id, stable while its key stays the same.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "in_sequence_count": {
            "description": "People here live in a sequence now.",
            "title": "In Sequence Count",
            "type": "integer"
          },
          "industry": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's industry, as its page shows it.",
            "title": "Industry"
          },
          "key": {
            "description": "The account's key: its domain (acme.com), or its LinkedIn page (li-co:acme) until a row ties that page to a domain.",
            "title": "Key",
            "type": "string"
          },
          "last_touch_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When outreach last reached anybody here: the newest sequence step that went out or was done on a profile, or a reply, whichever is later. None when nobody was.",
            "title": "Last Touch At"
          },
          "linkedin_page": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's LinkedIn page key, if known.",
            "title": "Linkedin Page"
          },
          "logo_path": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's logo, a path under this API's address that needs no credentials (`/accounts/logos/{name}/`). Null until one is found for its website: opening Accounts looks for the logos due in the background.",
            "title": "Logo Path"
          },
          "merges": {
            "description": "Each merge into this account, a merge into one merged into it too: the account merged in, the one it joined, who merged it and when, newest first.",
            "items": {
              "$ref": "#/components/schemas/AccountMergeReadSchema"
            },
            "title": "Merges",
            "type": "array"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "newest_row_at": {
            "description": "When the newest row on it was made.",
            "format": "date-time",
            "title": "Newest Row At",
            "type": "string"
          },
          "owner_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The owner's email, if known.",
            "title": "Owner Email"
          },
          "owner_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who owns its company record in a connected CRM, as the CRM names them; null when no CRM record names an owner, or the CRM has not said who that is.",
            "title": "Owner Name"
          },
          "owner_tool": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The CRM its owner comes from (Salesforce); set whenever a record names one.",
            "title": "Owner Tool"
          },
          "people_count": {
            "description": "How many people sit on it, each counted once.",
            "title": "People Count",
            "type": "integer"
          },
          "replied_count": {
            "description": "People here who replied, each counted once.",
            "title": "Replied Count",
            "type": "integer"
          },
          "search_match": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountSearchMatchReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a search found it when its name and domain do not hold the search; null otherwise, and with no search."
          },
          "table_count": {
            "description": "How many linked tables hold a row on it.",
            "title": "Table Count",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "key",
          "name",
          "domain",
          "linkedin_page",
          "table_count",
          "company_row_count",
          "people_count",
          "has_activity",
          "newest_row_at",
          "last_touch_at",
          "replied_count",
          "bounced_count",
          "in_sequence_count",
          "industry",
          "employees",
          "employee_count",
          "merges"
        ],
        "title": "AccountDetailReadSchema",
        "type": "object"
      },
      "AccountDraftBranchReadSchema": {
        "description": "A person with drafted lines under them, for confirming them all at once.",
        "properties": {
          "lines_under": {
            "description": "Drafted lines anywhere under them, theirs left out.",
            "title": "Lines Under",
            "type": "integer"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "person_id": {
            "format": "uuid",
            "title": "Person Id",
            "type": "string"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          }
        },
        "required": [
          "person_id",
          "name",
          "title",
          "lines_under"
        ],
        "title": "AccountDraftBranchReadSchema",
        "type": "object"
      },
      "AccountDraftFailedSchema": {
        "description": "Why a draft could not be made: written to be read as it is, by a person or an AI.\n\nThe 502's own model, not the shared ``ServerErrorResponse``: a route that documents a\n5xx with a model of its own is saying its body is written to be read, so the AI\nAssistant relays it rather than calling the product broken (``relayable_5xx``).",
        "properties": {
          "detail": {
            "description": "What happened, and that nothing on the chart changed.",
            "title": "Detail",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "title": "AccountDraftFailedSchema",
        "type": "object"
      },
      "AccountDraftOutcome": {
        "description": "What one ask for the free draft did.",
        "enum": [
          "drafting",
          "drafted",
          "reused",
          "capped",
          "failed"
        ],
        "title": "AccountDraftOutcome",
        "type": "string"
      },
      "AccountDraftedLineReadSchema": {
        "description": "One line drawn from the draft, Likely until a person confirms it.",
        "properties": {
          "above_ids": {
            "description": "Everyone above them on the drawn lines, nearest first. Confirming all under any of them confirms this line, unless a line between them is called wrong first.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Above Ids",
            "type": "array"
          },
          "manager_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who the draft says they report to; null: nobody.",
            "title": "Manager Id"
          },
          "manager_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Manager Name"
          },
          "manager_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Manager Title"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "person_id": {
            "format": "uuid",
            "title": "Person Id",
            "type": "string"
          },
          "reason": {
            "description": "Why the draft guessed it, in a few words.",
            "title": "Reason",
            "type": "string"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          }
        },
        "required": [
          "person_id",
          "name",
          "title",
          "manager_id",
          "manager_name",
          "manager_title",
          "reason",
          "above_ids"
        ],
        "title": "AccountDraftedLineReadSchema",
        "type": "object"
      },
      "AccountDraftedLinesBulkUpdateResponseSchema": {
        "description": "How many drafted lines one approve, reject or restore changed.",
        "properties": {
          "updated": {
            "description": "Lines changed: confirmed, called wrong, or drawn again. A line already in the state asked for is left alone and not counted.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated"
        ],
        "title": "AccountDraftedLinesBulkUpdateResponseSchema",
        "type": "object"
      },
      "AccountDraftedLinesConfirmSchema": {
        "description": "Which drafted lines a person confirms: some people's, or every one under someone.",
        "properties": {
          "drafted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The drafted_at the lines were read with. When another draft was made since, the answer is 409 and nothing changes, so no guess a person never saw becomes theirs.",
            "title": "Drafted At"
          },
          "person_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 150,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The people whose drafted line to confirm.",
            "title": "Person Ids"
          },
          "under_person_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Or: confirm every drafted line under this person, at any depth, theirs left out.",
            "title": "Under Person Id"
          }
        },
        "title": "AccountDraftedLinesConfirmSchema",
        "type": "object"
      },
      "AccountDraftedLinesDismissSchema": {
        "description": "The drafted lines a person says are wrong.",
        "properties": {
          "drafted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The drafted_at the lines were read with. When another draft was made since, the answer is 409 and nothing changes, so no guess a person never saw becomes theirs.",
            "title": "Drafted At"
          },
          "person_ids": {
            "description": "The people whose drafted line is wrong.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 150,
            "minItems": 1,
            "title": "Person Ids",
            "type": "array"
          }
        },
        "required": [
          "person_ids"
        ],
        "title": "AccountDraftedLinesDismissSchema",
        "type": "object"
      },
      "AccountDraftedLinesReadSchema": {
        "description": "Every line an account's chart draws from the draft, for a person to check.",
        "properties": {
          "branches": {
            "description": "Each person with drafted lines under them, most senior first.",
            "items": {
              "$ref": "#/components/schemas/AccountDraftBranchReadSchema"
            },
            "title": "Branches",
            "type": "array"
          },
          "drafted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the draft these lines come from was made. Send it with a confirm or a dismiss: once another draft is made, those answer 409 and change nothing.",
            "title": "Drafted At"
          },
          "lines": {
            "description": "Most senior first.",
            "items": {
              "$ref": "#/components/schemas/AccountDraftedLineReadSchema"
            },
            "title": "Lines",
            "type": "array"
          }
        },
        "required": [
          "lines",
          "branches",
          "drafted_at"
        ],
        "title": "AccountDraftedLinesReadSchema",
        "type": "object"
      },
      "AccountDraftedLinesRestoreSchema": {
        "description": "The people whose guesses a person says are wrong no more.",
        "properties": {
          "person_ids": {
            "description": "The people whose dismissed guesses to take back.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 150,
            "minItems": 1,
            "title": "Person Ids",
            "type": "array"
          }
        },
        "required": [
          "person_ids"
        ],
        "title": "AccountDraftedLinesRestoreSchema",
        "type": "object"
      },
      "AccountEmailStatus": {
        "description": "What is known of a person's address (review AC-12). None: nothing checked it.\n\nThe verdict of the Verify email column over the address on their row, the\nwords that column writes; BOUNCED when an email to them bounced, whatever\na check said.",
        "enum": [
          "valid",
          "catch_all",
          "risky",
          "unknown",
          "invalid",
          "disposable",
          "bounced"
        ],
        "title": "AccountEmailStatus",
        "type": "string"
      },
      "AccountFactCellSchema": {
        "description": "One cell a fact is read from, as the fact and its other values name it.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "column_id",
          "record_id"
        ],
        "title": "AccountFactCellSchema",
        "type": "object"
      },
      "AccountFactKind": {
        "description": "A fact the account page shows about the company, read from its company rows.",
        "enum": [
          "name",
          "website",
          "company_page",
          "industry",
          "employees",
          "location",
          "country",
          "description",
          "founded",
          "revenue"
        ],
        "title": "AccountFactKind",
        "type": "string"
      },
      "AccountFactReadSchema": {
        "description": "One fact about the company: the value shown, the cell it is in, and what else the rows say.\n\nThe value shown is the cell a rep pinned, else the newest value of the\naccount's own company rows, else of a company merged in.",
        "properties": {
          "agreeing": {
            "description": "Other rows giving the same value, however each spells it.",
            "title": "Agreeing",
            "type": "integer"
          },
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "title": "Column Name",
            "type": "string"
          },
          "disagreeing": {
            "description": "Each other value the rows give, newest first, at most five.",
            "items": {
              "$ref": "#/components/schemas/AccountFactValueReadSchema"
            },
            "title": "Disagreeing",
            "type": "array"
          },
          "disagreeing_count": {
            "description": "How many other values the rows give; ``disagreeing`` lists the newest five.",
            "title": "Disagreeing Count",
            "type": "integer"
          },
          "display_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The value as the page prints it, when not as the cell holds it: a website's host, a headcount or revenue held as bare digits in full.",
            "title": "Display Value"
          },
          "kind": {
            "$ref": "#/components/schemas/AccountFactKind"
          },
          "pin_lost": {
            "description": "A rep pinned a cell that holds no value here any more, so the newest row decides.",
            "title": "Pin Lost",
            "type": "boolean"
          },
          "pinned_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pinned At"
          },
          "pinned_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who pinned the fact to a cell; null when the newest row decides.",
            "title": "Pinned By User Id"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "value",
          "table_id",
          "table_name",
          "column_id",
          "column_name",
          "record_id",
          "updated_at",
          "agreeing",
          "disagreeing_count",
          "disagreeing",
          "pinned_by_user_id",
          "pinned_at",
          "pin_lost"
        ],
        "title": "AccountFactReadSchema",
        "type": "object"
      },
      "AccountFactUpdateSchema": {
        "description": "Which cell one fact is read from.",
        "properties": {
          "pin": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountFactCellSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cell to show the fact from: the one shown or one of its other values. Null hands the fact back to the newest row."
          }
        },
        "required": [
          "pin"
        ],
        "title": "AccountFactUpdateSchema",
        "type": "object"
      },
      "AccountFactUpdatedSchema": {
        "description": "A fact after a pin was set or taken off.",
        "properties": {
          "fact": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountFactReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The fact as the page shows it now; null when no row holds a value for it."
          }
        },
        "required": [
          "fact"
        ],
        "title": "AccountFactUpdatedSchema",
        "type": "object"
      },
      "AccountFactValueReadSchema": {
        "description": "One value the rows give a fact other than the one shown, at its newest cell.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "title": "Column Name",
            "type": "string"
          },
          "display_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The value as the page prints it, when not as the cell holds it.",
            "title": "Display Value"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "rows": {
            "description": "How many cells give this value, however each spells it.",
            "title": "Rows",
            "type": "integer"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value",
          "table_id",
          "table_name",
          "column_id",
          "column_name",
          "record_id",
          "updated_at",
          "rows"
        ],
        "title": "AccountFactValueReadSchema",
        "type": "object"
      },
      "AccountHeaderPersonReadSchema": {
        "description": "One person the header names.",
        "properties": {
          "id": {
            "description": "Their person id, as the People tab and org chart name them.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "description": "Their name, else their address, else their key.",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "AccountHeaderPersonReadSchema",
        "type": "object"
      },
      "AccountHeaderReadSchema": {
        "description": "The line under an account's name: the latest reply, who is in a sequence, the roles.",
        "properties": {
          "account_key": {
            "description": "The account's key, after any merge.",
            "title": "Account Key",
            "type": "string"
          },
          "crm": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountCrmRecordReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Its own company record in a connected CRM (the CRM table imported first, its newest row): the link and the owner. Null when no CRM record is on it."
          },
          "in_sequence_count": {
            "description": "People here live in a sequence now.",
            "title": "In Sequence Count",
            "type": "integer"
          },
          "latest_reply": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountHeaderPersonReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who wrote back last, on any channel; null when nobody here ever did."
          },
          "latest_reply_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When their newest message came.",
            "title": "Latest Reply At"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "roles": {
            "description": "Each role a rep gave a person on the org chart, in the role menu's order.",
            "items": {
              "$ref": "#/components/schemas/AccountHeaderRoleReadSchema"
            },
            "title": "Roles",
            "type": "array"
          }
        },
        "required": [
          "account_key",
          "name",
          "latest_reply",
          "latest_reply_at",
          "in_sequence_count",
          "roles"
        ],
        "title": "AccountHeaderReadSchema",
        "type": "object"
      },
      "AccountHeaderRoleReadSchema": {
        "description": "One part a rep gave a person in the deal.",
        "properties": {
          "person": {
            "$ref": "#/components/schemas/AccountHeaderPersonReadSchema"
          },
          "role": {
            "$ref": "#/components/schemas/AccountPersonRole"
          }
        },
        "required": [
          "role",
          "person"
        ],
        "title": "AccountHeaderRoleReadSchema",
        "type": "object"
      },
      "AccountHiddenReason": {
        "description": "Why a rep hid a person from the chart (review AC-33). None: not said.",
        "enum": [
          "left",
          "wrong_person",
          "not_relevant"
        ],
        "title": "AccountHiddenReason",
        "type": "string"
      },
      "AccountIndustryReadSchema": {
        "description": "One industry the Accounts list's accounts hold.",
        "properties": {
          "account_count": {
            "description": "How many accounts hold it.",
            "title": "Account Count",
            "type": "integer"
          },
          "industry": {
            "description": "The industry, as most of its accounts write it.",
            "title": "Industry",
            "type": "string"
          }
        },
        "required": [
          "industry",
          "account_count"
        ],
        "title": "AccountIndustryReadSchema",
        "type": "object"
      },
      "AccountKey": {
        "maxLength": 320,
        "minLength": 1,
        "pattern": "^(?:[^/.][^/]*|\\.[^/.][^/]*|\\.\\.[^/]+)$",
        "type": "string"
      },
      "AccountKeyKind": {
        "description": "Which value of a row named its account.",
        "enum": [
          "website",
          "company_page",
          "email_domain"
        ],
        "title": "AccountKeyKind",
        "type": "string"
      },
      "AccountKeyPath": {
        "description": "The account's key: its domain (acme.com), or its LinkedIn page (li-co:acme).",
        "maxLength": 320,
        "minLength": 1,
        "pattern": "^(?:[^/.][^/]*|\\.[^/.][^/]*|\\.\\.[^/]+)$",
        "type": "string"
      },
      "AccountLeftOffReadSchema": {
        "description": "A linked table's rows on no account for one reason (review AC-20).",
        "properties": {
          "reason": {
            "$ref": "#/components/schemas/AccountLeftOffReason"
          },
          "record_id": {
            "description": "The first of them, for a link to it in its table.",
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "row_count": {
            "description": "How many rows.",
            "title": "Row Count",
            "type": "integer"
          }
        },
        "required": [
          "reason",
          "row_count",
          "record_id"
        ],
        "title": "AccountLeftOffReadSchema",
        "type": "object"
      },
      "AccountLeftOffReason": {
        "description": "Why a row of a linked table is on no account, in words Sources and the table badge print.\n\nA fixed rule, read off the cells the decision reads (review AC-20: a Gmail\nrow was dropped silently, and the badge said only \"On 1 account\").",
        "enum": [
          "company_name_only",
          "personal_email",
          "no_company"
        ],
        "title": "AccountLeftOffReason",
        "type": "string"
      },
      "AccountLineConfidence": {
        "description": "How sure a line is: stated somewhere (confirmed), or the draft's guess (likely).",
        "enum": [
          "confirmed",
          "likely"
        ],
        "title": "AccountLineConfidence",
        "type": "string"
      },
      "AccountLineSource": {
        "description": "Where a reporting line came from.",
        "enum": [
          "rep",
          "table",
          "research",
          "draft"
        ],
        "title": "AccountLineSource",
        "type": "string"
      },
      "AccountLinkReason": {
        "description": "Why a table is not linked, in words the Sources panel and the table badge print.\n\nA linked table carries no reason. Archived tables stay linked (Utku,\n2026-11-01): archiving tidies the Tables list, it does not retire the data.",
        "enum": [
          "no_company_column",
          "two_company_columns",
          "turned_off"
        ],
        "title": "AccountLinkReason",
        "type": "string"
      },
      "AccountLinkStatus": {
        "description": "Whether a table's rows feed the Accounts page.",
        "enum": [
          "linked",
          "not_linked"
        ],
        "title": "AccountLinkStatus",
        "type": "string"
      },
      "AccountLinkedInMapCreateSchema": {
        "description": "Map an account's company on LinkedIn through a sender.",
        "properties": {
          "company_url": {
            "anyOf": [
              {
                "maxLength": 512,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's LinkedIn page. Omitted, the page the account's rows give; an account with none needs it.",
            "title": "Company Url"
          },
          "fast": {
            "default": true,
            "description": "Read the company page and search its people a minute or two apart, fitting between the sender's other steps, instead of waiting the sender's Time between steps (on their LinkedIn tab) before each. The price and the daily limits stay the same. False waits it like any other step.",
            "title": "Fast",
            "type": "boolean"
          },
          "sender_profile_id": {
            "description": "The sender whose LinkedIn opens the company's page and searches its people. Each page and each person read counts toward their daily limits.",
            "format": "uuid",
            "title": "Sender Profile Id",
            "type": "string"
          }
        },
        "required": [
          "sender_profile_id"
        ],
        "title": "AccountLinkedInMapCreateSchema",
        "type": "object"
      },
      "AccountLinkedInMapReadSchema": {
        "description": "An account's Map on LinkedIn: what it costs, which page it reads, and the newest map.",
        "properties": {
          "company_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company page a map reads: the one asked about, else the account's.",
            "title": "Company Url"
          },
          "map": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountLinkedInMapStateSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The newest map of the company, or null when it was never mapped."
          },
          "max_credits": {
            "description": "The most one map costs: the company page and each person the search reads, 0.1 credits each.",
            "title": "Max Credits",
            "type": "number"
          }
        },
        "required": [
          "company_url",
          "max_credits",
          "map"
        ],
        "title": "AccountLinkedInMapReadSchema",
        "type": "object"
      },
      "AccountLinkedInMapStateSchema": {
        "description": "Where the newest map of the company stands.",
        "properties": {
          "committee_size": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many people the buying committee holds, once done.",
            "title": "Committee Size"
          },
          "company_url": {
            "description": "The company page it maps.",
            "title": "Company Url",
            "type": "string"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What it waits for, or why it failed.",
            "title": "Message"
          },
          "people_on_account": {
            "description": "How many of the committee already show on this account: the account takes new people in within a minute or so.",
            "title": "People On Account",
            "type": "integer"
          },
          "people_table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table the committee landed in.",
            "title": "People Table Id"
          },
          "requested_at": {
            "format": "date-time",
            "title": "Requested At",
            "type": "string"
          },
          "sender_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sender Name"
          },
          "sender_profile_id": {
            "format": "uuid",
            "title": "Sender Profile Id",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/CompanyMapState",
            "description": "starting: asked for, nothing queued yet; waiting: a step waits in the sender's line (their browser may be offline); running: a step is running or the AI is choosing; done: the facts and the buying committee are in; failed: see message; stopped: its step was taken out of line on purpose, and mapping again asks again."
          },
          "step": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyMapStep"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step it is on: reading the company page, or searching its people."
          },
          "table_id": {
            "description": "The sender's map table, where the map's row lives.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "state",
          "step",
          "message",
          "sender_profile_id",
          "sender_name",
          "company_url",
          "table_id",
          "requested_at",
          "committee_size",
          "people_table_id",
          "people_on_account"
        ],
        "title": "AccountLinkedInMapStateSchema",
        "type": "object"
      },
      "AccountManagerChoice": {
        "description": "What a rep said of a person's manager. None: nothing, the chart's own sources decide.\n\n``PERSON`` names a manager at the account; ``TOP`` says the person reports\nto nobody here.",
        "enum": [
          "person",
          "top"
        ],
        "title": "AccountManagerChoice",
        "type": "string"
      },
      "AccountManagerColumnOfferReadSchema": {
        "description": "A people table's column the chart could be drawn from, once a person picks it.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "title": "Column Name",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "column_id",
          "column_name"
        ],
        "title": "AccountManagerColumnOfferReadSchema",
        "type": "object"
      },
      "AccountManagerLoopReadSchema": {
        "description": "Someone who already reports up to the person, so picking them as manager loops.",
        "properties": {
          "person_id": {
            "format": "uuid",
            "title": "Person Id",
            "type": "string"
          },
          "refused": {
            "description": "True when every line on the way is one people here set: a line to them is refused. False: it is allowed, and the table's or the researcher's line on the way gives way to it.",
            "title": "Refused",
            "type": "boolean"
          },
          "through_person_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who on the way reports straight to the person; None when they do.",
            "title": "Through Person Id"
          }
        },
        "required": [
          "person_id",
          "through_person_id",
          "refused"
        ],
        "title": "AccountManagerLoopReadSchema",
        "type": "object"
      },
      "AccountManagerLoopsReadSchema": {
        "description": "Everyone a pick of the person's manager would loop through (review AC-16).",
        "properties": {
          "loops": {
            "description": "Each person who already reports up to them, in chart order.",
            "items": {
              "$ref": "#/components/schemas/AccountManagerLoopReadSchema"
            },
            "title": "Loops",
            "type": "array"
          }
        },
        "required": [
          "loops"
        ],
        "title": "AccountManagerLoopsReadSchema",
        "type": "object"
      },
      "AccountMergeCreateSchema": {
        "description": "Merge one account into another.",
        "properties": {
          "from_key": {
            "$ref": "#/components/schemas/AccountKey",
            "description": "The account merged away."
          },
          "to_key": {
            "$ref": "#/components/schemas/AccountKey",
            "description": "The account it joins."
          }
        },
        "required": [
          "from_key",
          "to_key"
        ],
        "title": "AccountMergeCreateSchema",
        "type": "object"
      },
      "AccountMergePreviewSchema": {
        "description": "What a merge would move, before it is made.",
        "properties": {
          "from_account": {
            "$ref": "#/components/schemas/AccountReadSchema"
          },
          "likely_same_people": {
            "description": "The names of the people one account has that the other has under another address or profile: likely one person found twice once merged, which the People tab then flags.",
            "items": {
              "type": "string"
            },
            "title": "Likely Same People",
            "type": "array"
          },
          "merged_account": {
            "$ref": "#/components/schemas/AccountReadSchema",
            "description": "The account the two would make, as its row would read: its name and facts, the account joined's own first, then the one merged in's where it has none, and a value pinned on the account joined over both. What reached its people is not read: has_activity and the outreach counts read as none."
          },
          "people_moving": {
            "title": "People Moving",
            "type": "integer"
          },
          "rows_moving": {
            "title": "Rows Moving",
            "type": "integer"
          },
          "to_account": {
            "$ref": "#/components/schemas/AccountReadSchema"
          }
        },
        "required": [
          "from_account",
          "to_account",
          "rows_moving",
          "people_moving",
          "merged_account",
          "likely_same_people"
        ],
        "title": "AccountMergePreviewSchema",
        "type": "object"
      },
      "AccountMergeReadSchema": {
        "description": "One merge a person made: every row of the first account shows on the second.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created By User Id"
          },
          "from_key": {
            "title": "From Key",
            "type": "string"
          },
          "to_key": {
            "title": "To Key",
            "type": "string"
          }
        },
        "required": [
          "from_key",
          "to_key",
          "created_by_user_id",
          "created_at"
        ],
        "title": "AccountMergeReadSchema",
        "type": "object"
      },
      "AccountMergeSuggestionReadSchema": {
        "description": "Another account likely the same company, offered to merge, and why.",
        "properties": {
          "account": {
            "$ref": "#/components/schemas/AccountReadSchema"
          },
          "reason": {
            "$ref": "#/components/schemas/AccountMergeSuggestionReason",
            "description": "Why: same_linkedin_page (both name one LinkedIn company page), same_name (the names match once case, punctuation and a legal form like Inc go) or same_domain_name (acme.com and acme.io)."
          }
        },
        "required": [
          "account",
          "reason"
        ],
        "title": "AccountMergeSuggestionReadSchema",
        "type": "object"
      },
      "AccountMergeSuggestionReason": {
        "description": "Why another account is offered as the same company, strongest first.",
        "enum": [
          "same_linkedin_page",
          "same_name",
          "same_domain_name"
        ],
        "title": "AccountMergeSuggestionReason",
        "type": "string"
      },
      "AccountMergeSuggestionsReadSchema": {
        "description": "The accounts likely the same company as one, strongest rule first (review AC-18).",
        "properties": {
          "suggestions": {
            "description": "At most 5, strongest rule first, then most people.",
            "items": {
              "$ref": "#/components/schemas/AccountMergeSuggestionReadSchema"
            },
            "title": "Suggestions",
            "type": "array"
          }
        },
        "required": [
          "suggestions"
        ],
        "title": "AccountMergeSuggestionsReadSchema",
        "type": "object"
      },
      "AccountNamesake": {
        "description": "What another person at the account going by the same name is to someone (review AC-19).\n\nNames match as their words, case, accents and punctuation gone. LIKELY_SAME:\na full name (two words or more, none a lone letter) and nothing tells them\napart (at most one of them has a LinkedIn profile), so they are likely one\nperson found twice, as a merge leaves them. SAME_NAME: each has a LinkedIn\nprofile of their own, so they are two people, or the name is short of a\nfull one, which says too little. A placeholder (\"LinkedIn Member\") is no\nname, and names no namesakes.",
        "enum": [
          "likely_same",
          "same_name"
        ],
        "title": "AccountNamesake",
        "type": "string"
      },
      "AccountNamesakeReadSchema": {
        "description": "Another person at the account going by the same name (review AC-19).",
        "properties": {
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "id": {
            "description": "Their person id.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AccountNamesake",
            "description": "`likely_same`: nothing tells the two apart, so they are likely one person found twice (a merge often leaves them). `same_name`: each has a LinkedIn profile of their own, or the name is short of a full one (one word, or a lone letter)."
          },
          "linkedin_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Url"
          }
        },
        "required": [
          "id",
          "email",
          "linkedin_url",
          "kind"
        ],
        "title": "AccountNamesakeReadSchema",
        "type": "object"
      },
      "AccountOrgChartSchema": {
        "description": "An account's org chart: every person with their line, hidden people last.",
        "properties": {
          "budget_holder_candidates": {
            "description": "Up to three people the draft thinks may hold the budget; a rep decides.",
            "items": {
              "$ref": "#/components/schemas/AccountBudgetCandidateReadSchema"
            },
            "title": "Budget Holder Candidates",
            "type": "array"
          },
          "draft_current": {
            "description": "Whether the draft was made over the people shown now.",
            "title": "Draft Current",
            "type": "boolean"
          },
          "draft_guesses": {
            "default": 0,
            "description": "Of the people a draft reads, those with no confirmed line: the ones it guesses a line for.",
            "title": "Draft Guesses",
            "type": "integer"
          },
          "draft_reads": {
            "default": 0,
            "description": "People a draft reads: the most senior shown, up to 150. Past that, the more junior are left out.",
            "title": "Draft Reads",
            "type": "integer"
          },
          "drafted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the free draft was made, if ever.",
            "title": "Drafted At"
          },
          "drafts_left": {
            "description": "Free drafts left in the rolling 24 hours.",
            "title": "Drafts Left",
            "type": "integer"
          },
          "drafts_reset_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the next free draft frees up, once none is left.",
            "title": "Drafts Reset At"
          },
          "likely_lines": {
            "default": 0,
            "description": "Lines drawn from the draft now, each Likely until a person confirms it: GET /accounts/{account_key}/org-chart/drafted-lines/ lists them.",
            "title": "Likely Lines",
            "type": "integer"
          },
          "loops": {
            "description": "Each loop of reporting lines no person has decided (the tables', the researcher's, or lines people set that a merge brought together): the chart leaves one of its lines out. A person picks one by setting a person's manager (PATCH /accounts/{account_key}/people/{person_id}/); in a loop of lines people set, the others are handed back first (manager_choice null), as a line to them would loop.",
            "items": {
              "$ref": "#/components/schemas/AccountChartLoopReadSchema"
            },
            "title": "Loops",
            "type": "array"
          },
          "lost": {
            "description": "Each role or line a rep set whose person is no longer at the account, newest first. What the rep set is kept, and comes back if the person does.",
            "items": {
              "$ref": "#/components/schemas/AccountChartLossReadSchema"
            },
            "title": "Lost",
            "type": "array"
          },
          "manager_offers": {
            "description": "Each people table here with a column labelled like a manager (Manager, Reports to) that is not its manager column yet. Nothing is drawn from it until a person picks it: PATCH /accounts/sources/{table_id}/ with manager_column_id.",
            "items": {
              "$ref": "#/components/schemas/AccountManagerColumnOfferReadSchema"
            },
            "title": "Manager Offers",
            "type": "array"
          },
          "people": {
            "items": {
              "$ref": "#/components/schemas/AccountChartPersonReadSchema"
            },
            "title": "People",
            "type": "array"
          },
          "top_person_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The account's top person when no line says so yet: the head of the biggest tree, with no line of their own (none drawn, none left out for a loop) and no other person at the top of the chart as senior. The page reads them as Top of the account.",
            "title": "Top Person Id"
          },
          "tree_heads": {
            "description": "Each person heading a tree (no manager drawn, someone under them), the most people under them first: the order the chart lists its trees in. Hidden people are never counted. With levels, only the heads this answer sends.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Tree Heads",
            "type": "array"
          },
          "window": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountChartWindowReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "With levels: the part of the chart sent. None: all of it."
          }
        },
        "required": [
          "people",
          "budget_holder_candidates",
          "drafted_at",
          "draft_current",
          "drafts_left",
          "drafts_reset_at",
          "lost"
        ],
        "title": "AccountOrgChartSchema",
        "type": "object"
      },
      "AccountOutreachKind": {
        "description": "What reached somebody at an account, as the list's Outreach filter names it.",
        "enum": [
          "replied",
          "bounced",
          "in_sequence"
        ],
        "title": "AccountOutreachKind",
        "type": "string"
      },
      "AccountOverviewSchema": {
        "description": "What an account's page shows above its tabs: the facts, and every table it is in.",
        "properties": {
          "facts": {
            "items": {
              "$ref": "#/components/schemas/AccountFactReadSchema"
            },
            "title": "Facts",
            "type": "array"
          },
          "merged_keys": {
            "description": "The accounts a person merged into this one.",
            "items": {
              "type": "string"
            },
            "title": "Merged Keys",
            "type": "array"
          },
          "merges": {
            "description": "Each merge into this account: the account merged in, who merged it and when.",
            "items": {
              "$ref": "#/components/schemas/AccountMergeReadSchema"
            },
            "title": "Merges",
            "type": "array"
          },
          "tables": {
            "items": {
              "$ref": "#/components/schemas/AccountTableCardReadSchema"
            },
            "title": "Tables",
            "type": "array"
          }
        },
        "required": [
          "facts",
          "tables",
          "merged_keys",
          "merges"
        ],
        "title": "AccountOverviewSchema",
        "type": "object"
      },
      "AccountOwnerReadSchema": {
        "description": "One CRM owner the Accounts list's accounts have.",
        "properties": {
          "account_count": {
            "description": "How many accounts they own.",
            "title": "Account Count",
            "type": "integer"
          },
          "owner": {
            "description": "Their name, as most of their accounts write it.",
            "title": "Owner",
            "type": "string"
          },
          "tool_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The CRM they come from.",
            "title": "Tool Name"
          }
        },
        "required": [
          "owner",
          "tool_name",
          "account_count"
        ],
        "title": "AccountOwnerReadSchema",
        "type": "object"
      },
      "AccountPeopleCountSchema": {
        "description": "How many people at an account the People tab's search and filters keep.",
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "AccountPeopleCountSchema",
        "type": "object"
      },
      "AccountPeopleFacetReadSchema": {
        "description": "One value a People filter offers.",
        "properties": {
          "count": {
            "description": "How many people at the account hold it.",
            "title": "Count",
            "type": "integer"
          },
          "label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the value is named, when it is an id: a table's name.",
            "title": "Label"
          },
          "value": {
            "description": "The value, as the filter takes it; `none` for not known.",
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value",
          "count"
        ],
        "title": "AccountPeopleFacetReadSchema",
        "type": "object"
      },
      "AccountPeopleFacetsReadSchema": {
        "description": "What each People filter offers: the values the account's people hold, and how many.",
        "properties": {
          "department": {
            "items": {
              "$ref": "#/components/schemas/AccountPeopleFacetReadSchema"
            },
            "title": "Department",
            "type": "array"
          },
          "email_status": {
            "items": {
              "$ref": "#/components/schemas/AccountPeopleFacetReadSchema"
            },
            "title": "Email Status",
            "type": "array"
          },
          "namesake": {
            "description": "How many people have a namesake likely the same, or only by name.",
            "items": {
              "$ref": "#/components/schemas/AccountPeopleFacetReadSchema"
            },
            "title": "Namesake",
            "type": "array"
          },
          "role": {
            "items": {
              "$ref": "#/components/schemas/AccountPeopleFacetReadSchema"
            },
            "title": "Role",
            "type": "array"
          },
          "seniority": {
            "items": {
              "$ref": "#/components/schemas/AccountPeopleFacetReadSchema"
            },
            "title": "Seniority",
            "type": "array"
          },
          "table": {
            "description": "The tables the account's people are on, by id and name, most people first.",
            "items": {
              "$ref": "#/components/schemas/AccountPeopleFacetReadSchema"
            },
            "title": "Table",
            "type": "array"
          },
          "title": {
            "description": "The most common titles, most common first.",
            "items": {
              "$ref": "#/components/schemas/AccountPeopleFacetReadSchema"
            },
            "title": "Title",
            "type": "array"
          }
        },
        "required": [
          "seniority",
          "department",
          "title",
          "role",
          "email_status",
          "namesake",
          "table"
        ],
        "title": "AccountPeopleFacetsReadSchema",
        "type": "object"
      },
      "AccountPeopleSearchReadSchema": {
        "description": "The people search Find more people opens for one account (review AC-23).",
        "properties": {
          "account_key": {
            "description": "The account's key, after any merge.",
            "title": "Account Key",
            "type": "string"
          },
          "job_titles": {
            "description": "The job titles to search for; empty for none.",
            "items": {
              "type": "string"
            },
            "title": "Job Titles",
            "type": "array"
          },
          "job_titles_from": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountPeopleSearchTitles"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the titles came from: the Business context's roles or the titles the account's people hold; null with no titles."
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "websites": {
            "description": "Every website the account answers to: its own, then each merged into it.",
            "items": {
              "type": "string"
            },
            "title": "Websites",
            "type": "array"
          }
        },
        "required": [
          "account_key",
          "name",
          "websites",
          "job_titles",
          "job_titles_from"
        ],
        "title": "AccountPeopleSearchReadSchema",
        "type": "object"
      },
      "AccountPeopleSearchTitles": {
        "description": "Where Find more people took its job titles from (review AC-23).",
        "enum": [
          "business_context",
          "account_people"
        ],
        "title": "AccountPeopleSearchTitles",
        "type": "string"
      },
      "AccountPersonEnrolmentReadSchema": {
        "properties": {
          "bounced": {
            "description": "Whether an email to the person bounced.",
            "title": "Bounced",
            "type": "boolean"
          },
          "enrolment_id": {
            "format": "uuid",
            "title": "Enrolment Id",
            "type": "string"
          },
          "failure_code": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrolmentFailureCode"
              },
              {
                "type": "null"
              }
            ],
            "description": "What failed, on a failed enrolment only."
          },
          "last_sent_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Sent At"
          },
          "replied_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Replied At"
          },
          "sequence_id": {
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          },
          "sequence_name": {
            "title": "Sequence Name",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/EnrolmentStatus"
          },
          "stop_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StopReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a stopped enrolment stopped, such as a reply; null otherwise."
          }
        },
        "required": [
          "enrolment_id",
          "sequence_id",
          "sequence_name",
          "status",
          "last_sent_at",
          "replied_at",
          "stop_reason",
          "bounced",
          "failure_code"
        ],
        "title": "AccountPersonEnrolmentReadSchema",
        "type": "object"
      },
      "AccountPersonReadSchema": {
        "description": "One person at the account, once however many rows name them.",
        "properties": {
          "data_at": {
            "description": "How old what is shown is: when their title last changed.",
            "format": "date-time",
            "title": "Data At",
            "type": "string"
          },
          "department": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountDepartment"
              },
              {
                "type": "null"
              }
            ],
            "description": "The department their title names, read off its words; null if none."
          },
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "email_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountEmailStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "What is known of their address: the verdict of the Verify email column over it, or `bounced`; null when nothing checked it."
          },
          "enrolments": {
            "items": {
              "$ref": "#/components/schemas/AccountPersonEnrolmentReadSchema"
            },
            "title": "Enrolments",
            "type": "array"
          },
          "id": {
            "description": "The person's id: what a URL or an edit names them by.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "key": {
            "description": "The person's key: their LinkedIn profile, else their address.",
            "title": "Key",
            "type": "string"
          },
          "last_contacted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Contacted At"
          },
          "linkedin_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Url"
          },
          "matched_on": {
            "$ref": "#/components/schemas/AccountKeyKind",
            "description": "What put them on this account: their company's website, its LinkedIn page, or their work address."
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "namesake_count": {
            "description": "How many others at the account go by the same name, all of them.",
            "title": "Namesake Count",
            "type": "integer"
          },
          "namesakes": {
            "description": "The others at the account going by the same name, likely the same first, at most 10; their address or profile tells them apart.",
            "items": {
              "$ref": "#/components/schemas/AccountNamesakeReadSchema"
            },
            "title": "Namesakes",
            "type": "array"
          },
          "replied_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Replied At"
          },
          "role": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountPersonRole"
              },
              {
                "type": "null"
              }
            ],
            "description": "The part a rep says they play in a deal, set on the org chart."
          },
          "seniority": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountSeniority"
              },
              {
                "type": "null"
              }
            ],
            "description": "How senior their title says they are, read off its words; null with no title. `other` is a title with no rank word."
          },
          "sources": {
            "items": {
              "$ref": "#/components/schemas/AccountPersonSourceReadSchema"
            },
            "title": "Sources",
            "type": "array"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          }
        },
        "required": [
          "id",
          "key",
          "name",
          "title",
          "email",
          "linkedin_url",
          "matched_on",
          "data_at",
          "last_contacted_at",
          "replied_at",
          "sources",
          "enrolments",
          "seniority",
          "department",
          "email_status",
          "role",
          "namesakes",
          "namesake_count"
        ],
        "title": "AccountPersonReadSchema",
        "type": "object"
      },
      "AccountPersonRole": {
        "description": "The part a rep says a person plays in a deal. None: not known.",
        "enum": [
          "champion",
          "budget_holder",
          "decision_maker",
          "influencer",
          "user",
          "blocker"
        ],
        "title": "AccountPersonRole",
        "type": "string"
      },
      "AccountPersonSourceReadSchema": {
        "properties": {
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "record_id"
        ],
        "title": "AccountPersonSourceReadSchema",
        "type": "object"
      },
      "AccountPersonUpdateSchema": {
        "description": "What a rep sets for one person on the chart; a field left out stays as it is.",
        "properties": {
          "hidden": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Hide them from the chart, or show them.",
            "title": "Hidden"
          },
          "hidden_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountHiddenReason"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "Why they are hidden, sent with hidden true (review AC-33). left: they left the company; wrong_person: the row is not someone at this company; not_relevant: here, but not part of the deal. Showing them clears it.",
            "title": "Hidden Reason"
          },
          "manager_choice": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountManagerChoice"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "person: they report to manager_id; top: they report to nobody here; null hands their line back to the tables and the draft.",
            "title": "Manager Choice"
          },
          "manager_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their manager's person id, with person.",
            "title": "Manager Id"
          },
          "role": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountPersonRole"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "Their part in a deal; null when it is not known.",
            "title": "Role"
          }
        },
        "title": "AccountPersonUpdateSchema",
        "type": "object"
      },
      "AccountReachReadSchema": {
        "description": "One account a table's rows sit on, and how much of it they are.",
        "properties": {
          "account": {
            "$ref": "#/components/schemas/AccountReadSchema"
          },
          "people_count": {
            "description": "With a people table: the people those rows are.",
            "title": "People Count",
            "type": "integer"
          },
          "row_count": {
            "description": "The table's rows on it.",
            "title": "Row Count",
            "type": "integer"
          }
        },
        "required": [
          "account",
          "row_count",
          "people_count"
        ],
        "title": "AccountReachReadSchema",
        "type": "object"
      },
      "AccountReadSchema": {
        "description": "One account: a company, keyed by its domain, with every linked row that names it.",
        "properties": {
          "bounced_count": {
            "description": "People here an email bounced from.",
            "title": "Bounced Count",
            "type": "integer"
          },
          "company_row_count": {
            "description": "How many company rows sit on it.",
            "title": "Company Row Count",
            "type": "integer"
          },
          "domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Domain"
          },
          "employee_count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The headcount as a number the list sorts by: a range's low end.",
            "title": "Employee Count"
          },
          "employees": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's headcount as its page shows it: 35,000, or a range like 51-200.",
            "title": "Employees"
          },
          "has_activity": {
            "description": "Whether anybody here was enrolled in a sequence or has a conversation.",
            "title": "Has Activity",
            "type": "boolean"
          },
          "id": {
            "description": "The account's id, stable while its key stays the same.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "in_sequence_count": {
            "description": "People here live in a sequence now.",
            "title": "In Sequence Count",
            "type": "integer"
          },
          "industry": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's industry, as its page shows it.",
            "title": "Industry"
          },
          "key": {
            "description": "The account's key: its domain (acme.com), or its LinkedIn page (li-co:acme) until a row ties that page to a domain.",
            "title": "Key",
            "type": "string"
          },
          "last_touch_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When outreach last reached anybody here: the newest sequence step that went out or was done on a profile, or a reply, whichever is later. None when nobody was.",
            "title": "Last Touch At"
          },
          "linkedin_page": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's LinkedIn page key, if known.",
            "title": "Linkedin Page"
          },
          "logo_path": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's logo, a path under this API's address that needs no credentials (`/accounts/logos/{name}/`). Null until one is found for its website: opening Accounts looks for the logos due in the background.",
            "title": "Logo Path"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "newest_row_at": {
            "description": "When the newest row on it was made.",
            "format": "date-time",
            "title": "Newest Row At",
            "type": "string"
          },
          "owner_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The owner's email, if known.",
            "title": "Owner Email"
          },
          "owner_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who owns its company record in a connected CRM, as the CRM names them; null when no CRM record names an owner, or the CRM has not said who that is.",
            "title": "Owner Name"
          },
          "owner_tool": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The CRM its owner comes from (Salesforce); set whenever a record names one.",
            "title": "Owner Tool"
          },
          "people_count": {
            "description": "How many people sit on it, each counted once.",
            "title": "People Count",
            "type": "integer"
          },
          "replied_count": {
            "description": "People here who replied, each counted once.",
            "title": "Replied Count",
            "type": "integer"
          },
          "search_match": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountSearchMatchReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a search found it when its name and domain do not hold the search; null otherwise, and with no search."
          },
          "table_count": {
            "description": "How many linked tables hold a row on it.",
            "title": "Table Count",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "key",
          "name",
          "domain",
          "linkedin_page",
          "table_count",
          "company_row_count",
          "people_count",
          "has_activity",
          "newest_row_at",
          "last_touch_at",
          "replied_count",
          "bounced_count",
          "in_sequence_count",
          "industry",
          "employees",
          "employee_count"
        ],
        "title": "AccountReadSchema",
        "type": "object"
      },
      "AccountRowKind": {
        "description": "What one row of a linked table stands for on an account: the company, or a person there.",
        "enum": [
          "company",
          "person"
        ],
        "title": "AccountRowKind",
        "type": "string"
      },
      "AccountSearchMatchKind": {
        "description": "Why the list's search found an account its own name and key do not hold (review AC-26).",
        "enum": [
          "person",
          "merged_account",
          "row_name"
        ],
        "title": "AccountSearchMatchKind",
        "type": "string"
      },
      "AccountSearchMatchReadSchema": {
        "description": "Why the list's search found an account its own name and key do not hold (review AC-26).",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/AccountSearchMatchKind",
            "description": "`person`: a person on it is named so; `merged_account`: an account merged into it has this website or LinkedIn page; `row_name`: another row names the company so."
          },
          "value": {
            "description": "The person's name, the merged account's website, or the name.",
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "value"
        ],
        "title": "AccountSearchMatchReadSchema",
        "type": "object"
      },
      "AccountSeniority": {
        "description": "How senior a person's title says they are (review AC-12). None: no title.\n\nRead off the title's words by a fixed rule (``org_chart.title_seniority``):\na title with no rank word in it is OTHER, never guessed at.",
        "enum": [
          "executive",
          "vp",
          "head",
          "director",
          "manager",
          "senior",
          "other"
        ],
        "title": "AccountSeniority",
        "type": "string"
      },
      "AccountSizeBand": {
        "description": "A headcount band the list's Size filter offers, by the headcount's low end.",
        "enum": [
          "1-10",
          "11-50",
          "51-200",
          "201-500",
          "501-1000",
          "1001-5000",
          "5001-10000",
          "10001+",
          "unknown"
        ],
        "title": "AccountSizeBand",
        "type": "string"
      },
      "AccountSourceCandidateReadSchema": {
        "description": "A company column a person is asked to choose, when two disagree.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "title": "Column Name",
            "type": "string"
          }
        },
        "required": [
          "column_id",
          "column_name"
        ],
        "title": "AccountSourceCandidateReadSchema",
        "type": "object"
      },
      "AccountSourceColumnReadSchema": {
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "title": "Column Name",
            "type": "string"
          },
          "evidence": {
            "$ref": "#/components/schemas/AccountColumnEvidence",
            "description": "Why: a person chose it, a search or formula made it, an enrichment promoted it, its values read that way, or its label."
          },
          "role": {
            "$ref": "#/components/schemas/AccountColumnRole"
          }
        },
        "required": [
          "column_id",
          "column_name",
          "role",
          "evidence"
        ],
        "title": "AccountSourceColumnReadSchema",
        "type": "object"
      },
      "AccountSourceReachSchema": {
        "description": "What a table puts on Accounts: what taking it off would remove, counted now.",
        "properties": {
          "account_count": {
            "description": "The accounts its rows sit on.",
            "title": "Account Count",
            "type": "integer"
          },
          "accounts_only_here": {
            "description": "The accounts no other table holds: they leave the list with it.",
            "title": "Accounts Only Here",
            "type": "integer"
          },
          "indexing": {
            "description": "It is on and its rows are still on their way: the counts are not all of it yet.",
            "title": "Indexing",
            "type": "boolean"
          },
          "largest": {
            "description": "The few accounts it puts most rows on, most first.",
            "items": {
              "$ref": "#/components/schemas/AccountReachReadSchema"
            },
            "title": "Largest",
            "type": "array"
          },
          "people_count": {
            "description": "With a people table: the people those rows are.",
            "title": "People Count",
            "type": "integer"
          },
          "row_count": {
            "description": "Its rows on any account.",
            "title": "Row Count",
            "type": "integer"
          }
        },
        "required": [
          "row_count",
          "people_count",
          "account_count",
          "accounts_only_here",
          "largest",
          "indexing"
        ],
        "title": "AccountSourceReachSchema",
        "type": "object"
      },
      "AccountSourceReadSchema": {
        "description": "One table's standing on the Accounts page, and why.",
        "properties": {
          "account_count": {
            "description": "The accounts its rows sit on, at the last index.",
            "title": "Account Count",
            "type": "integer"
          },
          "awaits_index": {
            "description": "Whether an index of the table is on its way: it was looked at and is not indexed yet, in a workspace whose Accounts were opened. Its counts arrive when this turns false; false in a workspace that never opened Accounts, where nothing indexes it.",
            "title": "Awaits Index",
            "type": "boolean"
          },
          "candidates": {
            "description": "The columns a person may choose as the company column: the two that disagree when two website columns do, otherwise the one chosen, the columns that read as a website, a company LinkedIn page or a work email, then every other text, link or address column that is not a name, a profile, a manager or a company fact such as Industry.",
            "items": {
              "$ref": "#/components/schemas/AccountSourceCandidateReadSchema"
            },
            "title": "Candidates",
            "type": "array"
          },
          "columns": {
            "description": "The columns its rows are read through, and why each.",
            "items": {
              "$ref": "#/components/schemas/AccountSourceColumnReadSchema"
            },
            "title": "Columns",
            "type": "array"
          },
          "company_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Column Id"
          },
          "indexed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it was last indexed; None before then.",
            "title": "Indexed At"
          },
          "left_off": {
            "description": "Its rows on no account at the last index, by what they lack (`company_name_only`: a company name but no website, company page or work address; `personal_email`: only a personal address such as Gmail; `no_company`: nothing that names a company), each with the first such row; its rows number `row_count` plus these. Empty before an index counted them.",
            "items": {
              "$ref": "#/components/schemas/AccountLeftOffReadSchema"
            },
            "title": "Left Off",
            "type": "array"
          },
          "manager_candidates": {
            "description": "Columns that may hold each person's manager, by their label, for a person to pick as the manager column.",
            "items": {
              "$ref": "#/components/schemas/AccountSourceCandidateReadSchema"
            },
            "title": "Manager Candidates",
            "type": "array"
          },
          "manager_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Manager Column Id"
          },
          "manager_options": {
            "description": "Every column a person may pick as a people table's manager column: the suggested ones first, then each other column that could name a person (never the row's own name, title, profile, address or company, a website, a company fact, the Person researcher's or a column a sequence or an export writes), and the one chosen. A company table offers only the one chosen.",
            "items": {
              "$ref": "#/components/schemas/AccountSourceCandidateReadSchema"
            },
            "title": "Manager Options",
            "type": "array"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountLinkReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the table is not linked, if not."
          },
          "row_count": {
            "description": "Its rows on an account, at the last index.",
            "title": "Row Count",
            "type": "integer"
          },
          "row_kind": {
            "$ref": "#/components/schemas/AccountRowKind"
          },
          "show_on_accounts": {
            "title": "Show On Accounts",
            "type": "boolean"
          },
          "sole_account_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The one account its rows are on, when `account_count` is 1; read by `GET /accounts/sources/{table_id}/` alone, null in the list.",
            "title": "Sole Account Key"
          },
          "status": {
            "$ref": "#/components/schemas/AccountLinkStatus"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "status",
          "reason",
          "row_kind",
          "columns",
          "candidates",
          "manager_candidates",
          "manager_options",
          "show_on_accounts",
          "company_column_id",
          "manager_column_id",
          "row_count",
          "account_count",
          "left_off",
          "indexed_at",
          "awaits_index"
        ],
        "title": "AccountSourceReadSchema",
        "type": "object"
      },
      "AccountSourceUpdateSchema": {
        "description": "What a person sets for one table on the Accounts page; a field left out stays as it is.",
        "properties": {
          "company_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The column that names each row's company, chosen by hand; null goes back to the column the table's own columns point to.",
            "title": "Company Column Id"
          },
          "manager_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The column holding each person's manager (a name, address or profile); null reads no manager column.",
            "title": "Manager Column Id"
          },
          "show_on_accounts": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Whether the table feeds Accounts.",
            "title": "Show On Accounts"
          }
        },
        "title": "AccountSourceUpdateSchema",
        "type": "object"
      },
      "AccountSplitCreateSchema": {
        "description": "Split a website out of the account its domain names.",
        "properties": {
          "account_key": {
            "$ref": "#/components/schemas/AccountKey",
            "description": "The account the website is under."
          },
          "host": {
            "description": "The website to split out, as the account's websites list names it.",
            "maxLength": 320,
            "minLength": 1,
            "title": "Host",
            "type": "string"
          }
        },
        "required": [
          "account_key",
          "host"
        ],
        "title": "AccountSplitCreateSchema",
        "type": "object"
      },
      "AccountSplitPreviewSchema": {
        "description": "What a split would move, before it is made.",
        "properties": {
          "account_key": {
            "title": "Account Key",
            "type": "string"
          },
          "host": {
            "title": "Host",
            "type": "string"
          },
          "name": {
            "description": "The name of the account the website would leave.",
            "title": "Name",
            "type": "string"
          },
          "people_count": {
            "description": "The people on those rows.",
            "title": "People Count",
            "type": "integer"
          },
          "row_count": {
            "description": "The rows that would move, under the website and below it.",
            "title": "Row Count",
            "type": "integer"
          }
        },
        "required": [
          "host",
          "account_key",
          "name",
          "row_count",
          "people_count"
        ],
        "title": "AccountSplitPreviewSchema",
        "type": "object"
      },
      "AccountSplitReadSchema": {
        "description": "One website a person split out of the account its domain names.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created By User Id"
          },
          "host": {
            "description": "The website split out: its rows have an account of their own.",
            "title": "Host",
            "type": "string"
          },
          "parent_key": {
            "description": "The account its rows sat on, where folding it back puts them.",
            "title": "Parent Key",
            "type": "string"
          },
          "row_count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The rows on the website's account now, in an account's websites (null elsewhere). 0 once every row read from it is gone: the split still keys new rows from it, but no account shows it until one arrives.",
            "title": "Row Count"
          }
        },
        "required": [
          "host",
          "parent_key",
          "created_by_user_id",
          "created_at"
        ],
        "title": "AccountSplitReadSchema",
        "type": "object"
      },
      "AccountTableCardReadSchema": {
        "description": "One linked table's rows on the account: how many, and the newest few.",
        "properties": {
          "row_count": {
            "description": "Its rows on the account; its people, for a people table.",
            "title": "Row Count",
            "type": "integer"
          },
          "row_kind": {
            "$ref": "#/components/schemas/AccountRowKind"
          },
          "rows": {
            "description": "The newest few rows; on a people table, one row a person, the most senior first.",
            "items": {
              "$ref": "#/components/schemas/AccountTableRowReadSchema"
            },
            "title": "Rows",
            "type": "array"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          },
          "tool_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The tool the table is imported from, when that tool links its records.",
            "title": "Tool Name"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "row_kind",
          "row_count",
          "rows"
        ],
        "title": "AccountTableCardReadSchema",
        "type": "object"
      },
      "AccountTableRowReadSchema": {
        "properties": {
          "cells": {
            "items": {
              "$ref": "#/components/schemas/AccountCellReadSchema"
            },
            "title": "Cells",
            "type": "array"
          },
          "label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Label"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The row's record in the tool its table is imported from, when it links one.",
            "title": "Url"
          }
        },
        "required": [
          "record_id",
          "label",
          "cells"
        ],
        "title": "AccountTableRowReadSchema",
        "type": "object"
      },
      "AccountWebsiteReadSchema": {
        "description": "One website under an account's domain its rows were read from.",
        "properties": {
          "host": {
            "description": "The website, such as eu.acme.com under acme.com.",
            "title": "Host",
            "type": "string"
          },
          "people_count": {
            "description": "The people on those rows.",
            "title": "People Count",
            "type": "integer"
          },
          "row_count": {
            "description": "The account's rows read from it.",
            "title": "Row Count",
            "type": "integer"
          }
        },
        "required": [
          "host",
          "row_count",
          "people_count"
        ],
        "title": "AccountWebsiteReadSchema",
        "type": "object"
      },
      "AccountWebsitesReadSchema": {
        "description": "The websites under an account's domain, which a person may split out, and its splits.",
        "properties": {
          "account_key": {
            "title": "Account Key",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "split_from": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AccountSplitReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The split that made this account, when it is a website split out of another."
          },
          "split_out": {
            "description": "The websites split out of this account.",
            "items": {
              "$ref": "#/components/schemas/AccountSplitReadSchema"
            },
            "title": "Split Out",
            "type": "array"
          },
          "websites": {
            "description": "Each website under the account's domain its own rows came from, most rows first (at most 50). The rows read from the domain itself are not listed.",
            "items": {
              "$ref": "#/components/schemas/AccountWebsiteReadSchema"
            },
            "title": "Websites",
            "type": "array"
          }
        },
        "required": [
          "account_key",
          "name",
          "websites",
          "split_out",
          "split_from"
        ],
        "title": "AccountWebsitesReadSchema",
        "type": "object"
      },
      "ActionApproveBatchResponseSchema": {
        "description": "What became of each card in one Approve all.",
        "properties": {
          "actions": {
            "description": "Every card named, in the order asked for, as it stands now: applied, or failed with the reason on the card. A card that had already been decided comes back unchanged.",
            "items": {
              "$ref": "#/components/schemas/ActionProposalReadSchema"
            },
            "title": "Actions",
            "type": "array"
          },
          "updated": {
            "description": "How many of the cards were waiting and have now been decided. A card that had already been decided is in `actions` unchanged and is not counted.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "actions"
        ],
        "title": "ActionApproveBatchResponseSchema",
        "type": "object"
      },
      "ActionApproveBatchSchema": {
        "description": "Approve every card one reply raised, with one answer about next time.",
        "properties": {
          "proposal_ids": {
            "description": "The cards to approve, normally every card in one reply's batch. Each is applied on its own: one that fails does not stop the rest.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "title": "Proposal Ids",
            "type": "array"
          },
          "scope": {
            "$ref": "#/components/schemas/ApprovalScope",
            "default": "once",
            "description": "How far the approval reaches, applied to every card in the list."
          }
        },
        "required": [
          "proposal_ids"
        ],
        "title": "ActionApproveBatchSchema",
        "type": "object"
      },
      "ActionApproveSchema": {
        "description": "Approve a proposal, and say whether the next one like it should still ask.",
        "properties": {
          "scope": {
            "$ref": "#/components/schemas/ApprovalScope",
            "default": "once",
            "description": "How far this approval reaches. `once` decides this card and nothing else. `thread` allows the operation for the rest of this conversation. `project_me` allows it for you everywhere in this workspace, and `project_all` for everybody in it. A send is never grantable and always asks again, whatever is chosen here."
          }
        },
        "title": "ActionApproveSchema",
        "type": "object"
      },
      "ActionConflictResponseSchema": {
        "description": "A decision the proposal's state no longer allows: already decided, or not reversible.",
        "properties": {
          "detail": {
            "title": "Detail",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "title": "ActionConflictResponseSchema",
        "type": "object"
      },
      "ActionProposalReadSchema": {
        "description": "One action the assistant proposed or applied, and what became of it: the card.\n\nPrices are quoted in credits, never tenths, and never as a raw id: who\ndecided is a display name resolved at this boundary. ``applied_result``\nis the verb's own record of what it made (the new column's id, the rows\nenrolled), which is what the card links to.",
        "properties": {
          "applied_result": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "The verb's or tool's own record of what it made; null until applied. A tool card carries `content` (what the assistant read back), `link` (an app path to the thing), `link_label` (its name), `entity_id`, `opens` (whether the page should go to the link when this lands) and `made` (what was created, for the AI-made mark), plus any facts the tool added.",
            "title": "Applied Result"
          },
          "approve_label": {
            "description": "What the Approve button says: \"Approve\", or for a run charged by use what it usually costs, \"Approve \u00b7 about 24 credits\", or with no usual figure the most it spends, \"Approve \u00b7 up to 8 credits\", or with a flat price, \"Approve \u00b7 8 credits\", or per day, \"Approve \u00b7 up to 145 credits a day\".",
            "title": "Approve Label",
            "type": "string"
          },
          "batch_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cards the assistant raised together in one reply share this, so they can be shown and approved as a group. Null for a card raised on its own.",
            "title": "Batch Id"
          },
          "charged_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the run this card started was charged, in credits, once it finished. Null until then, and for every card that starts no run.",
            "title": "Charged Credits"
          },
          "conversation_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Conversation Id"
          },
          "decided_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Decided At"
          },
          "decided_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Decided By Display Name"
          },
          "destructive": {
            "default": false,
            "description": "Whether approving this removes something. A destructive card is drawn apart from the safe ones, is never offered a standing grant, and is listed on its own in the confirm an Approve all opens.",
            "title": "Destructive",
            "type": "boolean"
          },
          "detail": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposalDetailSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the card shows under its summary, when one line is not enough to decide on: a prompt being rewritten, an email being reworded. Null for most cards, which say it all in the summary."
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why an approval failed to apply, in plain words; null otherwise.",
            "title": "Error"
          },
          "expected_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the run usually costs, in credits, read from what the same kind of cell has been charged before; equal to price_credits for a flat price, which the card then says as one figure. Null for a card whose price is the whole story.",
            "title": "Expected Credits"
          },
          "grantable": {
            "description": "Whether the card may offer Approve and allow in this conversation: only a pending proposal of a verb that is not a send.",
            "title": "Grantable",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ProposalKind",
            "description": "`verb` for one of the eight workspace actions, `tool` for an API operation the assistant asked to call on your behalf."
          },
          "loss": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What approving a destructive card takes away, and whether it comes back, in one sentence; null when nothing is removed.",
            "title": "Loss"
          },
          "message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message Id"
          },
          "origin": {
            "$ref": "#/components/schemas/ProposalOrigin"
          },
          "prepared_column": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PreparedColumnSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column this card created before it was decided, so it can be opened from the card while it waits. Null for every other card. Approving runs the column; dismissing removes it, because adding it and running it were one decision."
          },
          "price_aside": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a waiting card says beside its Approve button, when the button does not say it all: the most a run charged by use can spend, \"Up to 65 credits\", \"Free\", \"Free to build \u00b7 sending up to 45 credits\". Null when the button says everything.",
            "title": "Price Aside"
          },
          "price_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The published price of the operation when it was proposed, in credits; null when free.",
            "title": "Price Credits"
          },
          "price_label": {
            "description": "What the card says it costs: \"Free\", or the most it can spend, \"Up to 16.5 credits\"; for a run charged by use, what it usually costs and then the most, \"About 24 credits \u00b7 up to 65\"; for a flat price (a run of enrichments that each have one price), the one figure, \"2,800 credits\"; once that run has ended, \"Charged 23.8 credits\"; and for a card priced per day, \"Up to 145 credits a day\", before and after it is approved.",
            "title": "Price Label",
            "type": "string"
          },
          "price_per": {
            "$ref": "#/components/schemas/PricePer",
            "default": "call",
            "description": "What price_credits is the price of. `call`: the most approving this card may spend, once. `day`: the card starts something that keeps spending by itself (no tool raises one today), and price_credits is the most one day may cost (\"Approve \u00b7 up to 145 credits a day\"). A total of several cards, such as Approve all's, leaves a `day` card out of its one-off sum."
          },
          "proposed_at": {
            "format": "date-time",
            "title": "Proposed At",
            "type": "string"
          },
          "runs_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column approving this card runs, while the card waits: the one it added, or one already on the table that it names. Lets the column's own panel approve this card instead of starting a second run. Null for a card that runs no column, and once the card is decided.",
            "title": "Runs Column Id"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent column whose run raised the card; null for every other origin. What puts a card on its table's page when its arguments name a sequence or a destination instead of the table.",
            "title": "Source Column Id"
          },
          "source_record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The row the agent was working on when it raised the card; null otherwise.",
            "title": "Source Record Id"
          },
          "status": {
            "$ref": "#/components/schemas/ProposalStatus"
          },
          "summary": {
            "title": "Summary",
            "type": "string"
          },
          "verb": {
            "description": "What the card proposes: one of the eight workspace verbs, or the name of an API operation the assistant asked to call. `kind` says which.",
            "title": "Verb",
            "type": "string"
          },
          "verb_label": {
            "title": "Verb Label",
            "type": "string"
          }
        },
        "required": [
          "id",
          "origin",
          "conversation_id",
          "message_id",
          "source_column_id",
          "source_record_id",
          "verb",
          "kind",
          "batch_id",
          "verb_label",
          "summary",
          "price_credits",
          "price_label",
          "approve_label",
          "price_aside",
          "status",
          "proposed_at",
          "decided_at",
          "decided_by_display_name",
          "applied_result",
          "error",
          "grantable"
        ],
        "title": "ActionProposalReadSchema",
        "type": "object"
      },
      "ActivityBackgroundChecks": {
        "description": "Whether a reading of Activity lists our own LinkedIn reads of the sender's account.\n\nThe reads (``BACKGROUND_CHECK_KINDS``: the inbox, the sent invitations, the\nnewest connections, one conversation) act on nobody, so every Activity page\nhides them unless a person turns them on (Utku, 2026-10-19: behind a\nfilter, so a customer worried about their LinkedIn account can see every\ntime we touched it). ``HIDE`` leaves them out, ``INCLUDE`` lists them with\neverything else, ``ONLY`` lists them alone.",
        "enum": [
          "hide",
          "include",
          "only"
        ],
        "title": "ActivityBackgroundChecks",
        "type": "string"
      },
      "ActivityDecision": {
        "description": "Who let one unit of outreach go, or refused it.\n\n``APPROVED``: a person (or an API key) approved it before it went.\n``AUTOMATIC``: nobody was asked; the sender's or the sequence's rules let\nit go. ``REJECTED``: a person refused it, so it never went.\n``SENT_BY_PERSON``: a person wrote it and sent it themselves, from the inbox.\n``NOT_RECORDED``: a LinkedIn step that ran before Activity existed whose\napproval a later step of the same contact has since overwritten; saying so\nis truer than guessing.",
        "enum": [
          "approved",
          "automatic",
          "rejected",
          "sent_by_person",
          "not_recorded"
        ],
        "title": "ActivityDecision",
        "type": "string"
      },
      "ActivityOutcome": {
        "description": "How one unit of outreach ended.\n\n``SENT`` is an email the provider accepted, or a LinkedIn message, InMail\nor connection request that went out, so one thing reads one way on both\nchannels (2026-10-21); ``DONE`` a LinkedIn step that only acted on a\nprofile (a view, a follow, a like, a withdrawal). ``SKIPPED`` is a step that\ndid not apply or was passed over in the extension; ``ALREADY_PENDING`` the\none skip every LinkedIn surface names apart, a connection request somebody\nhad already sent; ``STOPPED`` one stopped while a browser ran it.\n``NOT_SENT`` is a task a person refused, which never reached its channel.\n``RECEIVED`` is the one row that is not ours: a message the contact sent us,\nor their acceptance of our connection request (``ReceivedActivityKind``,\nreview AC-11).\n\nA Browser use run (BU-18) settles ``DONE`` on one of its step's outcomes,\n``NEEDS_HUMAN`` when it left the contact for a person, or ``FAILED``.",
        "enum": [
          "sent",
          "done",
          "failed",
          "skipped",
          "already_pending",
          "stopped",
          "not_sent",
          "received",
          "needs_human"
        ],
        "title": "ActivityOutcome",
        "type": "string"
      },
      "ActivityReceived": {
        "description": "Whether a reading of Activity lists what contacts did (outcome ``RECEIVED``).\n\nEvery page's Activity lists it with what went out, so a conversation reads\nwhole (review AC-11); the Tasks page's Completed tab hides it, as no task\nfinished there. ``ONLY`` lists nothing else.",
        "enum": [
          "include",
          "hide",
          "only"
        ],
        "title": "ActivityReceived",
        "type": "string"
      },
      "ActorKind": {
        "description": "Who authorised an action.",
        "enum": [
          "user",
          "api",
          "system"
        ],
        "title": "ActorKind",
        "type": "string"
      },
      "AddAgentToTableRequestSchema": {
        "description": "Apply a saved agent to a table as a linked enrichment column.",
        "properties": {
          "column_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What to call the parent column; the agent's own name when omitted. Worth asking for: the name labels the fan-out group, it is the only column visible while that group is collapsed, and for a single-output agent it IS the answer column. It is also the only way to deploy one agent onto a table twice.",
            "title": "Column Name"
          },
          "input_mappings": {
            "additionalProperties": {
              "format": "uuid",
              "type": "string"
            },
            "description": "Which table column (id) feeds each agent input (by the input's id).",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Input Mappings",
            "type": "object"
          },
          "output_column_names": {
            "additionalProperties": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "description": "What to call each fanned-out child column, keyed by output field name. The setup dialog previews these names, so it sends every one it showed rather than only the edited ones. A preview is worth having only if it is what the table gets. A field with no entry keeps the derived name, and a name already taken falls back to the derived one rather than losing the column.",
            "maxProperties": 50,
            "propertyNames": {
              "maxLength": 100,
              "minLength": 1
            },
            "title": "Output Column Names",
            "type": "object"
          },
          "output_field_names": {
            "description": "The output fields to fan out into their own columns.",
            "items": {
              "maxLength": 100,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 50,
            "title": "Output Field Names",
            "type": "array"
          },
          "position": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Insert position; appended when omitted. Places the parent column, and its fanned-out children land immediately after it, so one position anchors the whole group where the author clicked.",
            "title": "Position"
          },
          "run_rows": {
            "anyOf": [
              {
                "maximum": 50.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rows to run once the column exists, counted from the top of the table's own order. Omit to create it unrun, so the author can adjust the mapping before spending credits. Bounded deliberately: there is no 'run all' here at any value.",
            "title": "Run Rows"
          },
          "table_id": {
            "description": "The table to add the agent's column to.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "use_row_context": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the deployed column folds the rest of the row in as context, decided HERE rather than inherited. Null keeps the agent's own stored answer, which is what a client that does not ask the question should get; the setup dialog always sends an explicit value, because whether a run reads the whole row is a per-table decision and the agent's flag was set somewhere else entirely. Stamped onto the column either way. Reading the agent's live value on every run would let a later edit silently change what a deployed column sends.",
            "title": "Use Row Context"
          }
        },
        "required": [
          "table_id"
        ],
        "title": "AddAgentToTableRequestSchema",
        "type": "object"
      },
      "AffiliateDailyStatReadSchema": {
        "description": "One day of the per-day graph series. Quiet days are present, as zeroes.",
        "properties": {
          "clicks": {
            "title": "Clicks",
            "type": "integer"
          },
          "conversions": {
            "title": "Conversions",
            "type": "integer"
          },
          "day": {
            "format": "date",
            "title": "Day",
            "type": "string"
          },
          "earned_cents": {
            "title": "Earned Cents",
            "type": "integer"
          },
          "signups": {
            "title": "Signups",
            "type": "integer"
          }
        },
        "required": [
          "day",
          "clicks",
          "signups",
          "conversions",
          "earned_cents"
        ],
        "title": "AffiliateDailyStatReadSchema",
        "type": "object"
      },
      "AffiliateEnrollRequestSchema": {
        "description": "The one thing enrollment asks for: what to call the affiliate.",
        "properties": {
          "display_name": {
            "description": "The name shown to referred users in welcome copy.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Display Name",
            "type": "string"
          }
        },
        "required": [
          "display_name"
        ],
        "title": "AffiliateEnrollRequestSchema",
        "type": "object"
      },
      "AffiliateFeedItemKind": {
        "description": "What one anonymous activity-feed row reports.",
        "enum": [
          "signup",
          "conversion",
          "commission",
          "clawback",
          "payout",
          "forfeiture"
        ],
        "title": "AffiliateFeedItemKind",
        "type": "string"
      },
      "AffiliateFeedItemReadSchema": {
        "description": "One anonymous activity-feed row.",
        "properties": {
          "amount_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Signed cents for money rows; null for signup and conversion rows.",
            "title": "Amount Cents"
          },
          "kind": {
            "$ref": "#/components/schemas/AffiliateFeedItemKind"
          },
          "occurred_at": {
            "format": "date-time",
            "title": "Occurred At",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "occurred_at",
          "amount_cents"
        ],
        "title": "AffiliateFeedItemReadSchema",
        "type": "object"
      },
      "AffiliateLedgerEntryKind": {
        "description": "The kind of an affiliate ledger entry. Amounts are signed USD cents.",
        "enum": [
          "commission",
          "clawback_refund",
          "clawback_dispute",
          "dispute_reversal",
          "payout",
          "adjustment",
          "forfeiture"
        ],
        "title": "AffiliateLedgerEntryKind",
        "type": "string"
      },
      "AffiliateLedgerEntryReadSchema": {
        "description": "One signed movement of affiliate money.",
        "properties": {
          "amount_cents": {
            "title": "Amount Cents",
            "type": "integer"
          },
          "available_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a commission matures into the payable balance; null for immediate kinds.",
            "title": "Available At"
          },
          "currency": {
            "title": "Currency",
            "type": "string"
          },
          "description": {
            "title": "Description",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AffiliateLedgerEntryKind"
          },
          "occurred_at": {
            "format": "date-time",
            "title": "Occurred At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "kind",
          "amount_cents",
          "currency",
          "description",
          "occurred_at",
          "available_at"
        ],
        "title": "AffiliateLedgerEntryReadSchema",
        "type": "object"
      },
      "AffiliateMaturityReadSchema": {
        "description": "One future day on which pending commission becomes payable.",
        "properties": {
          "amount_cents": {
            "title": "Amount Cents",
            "type": "integer"
          },
          "day": {
            "format": "date",
            "title": "Day",
            "type": "string"
          },
          "running_available_cents": {
            "description": "The payable balance once this day has matured, absent clawbacks and payouts.",
            "title": "Running Available Cents",
            "type": "integer"
          }
        },
        "required": [
          "day",
          "amount_cents",
          "running_available_cents"
        ],
        "title": "AffiliateMaturityReadSchema",
        "type": "object"
      },
      "AffiliateNextPayoutStatus": {
        "description": "What the next monthly run will do with this affiliate's balance.\n\nDerived from the same gates the payout engine applies, so the sentence the\ndashboard prints and the decision the run makes cannot disagree. Every\n\"your payout goes out on the 1st\" used to be unconditional, which made it\nfalse for a first payout (held for a human), a blocked affiliate (no\nidentity check, no PayPal address, a fresh address inside its hold), a\nsuspended or banned account, a balance under the minimum, and the whole\nperiod the program ships with payouts switched off.",
        "enum": [
          "paused",
          "unavailable",
          "under_review",
          "blocked",
          "below_minimum",
          "scheduled"
        ],
        "title": "AffiliateNextPayoutStatus",
        "type": "string"
      },
      "AffiliatePayoutReadSchema": {
        "description": "One monthly payout.",
        "properties": {
          "amount_cents": {
            "title": "Amount Cents",
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "paid_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Paid At"
          },
          "period": {
            "title": "Period",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/AffiliatePayoutStatus"
          }
        },
        "required": [
          "id",
          "period",
          "amount_cents",
          "status",
          "paid_at",
          "created_at"
        ],
        "title": "AffiliatePayoutReadSchema",
        "type": "object"
      },
      "AffiliatePayoutStatus": {
        "description": "Where one monthly payout is in the PayPal Payouts lifecycle.",
        "enum": [
          "held",
          "created",
          "paid",
          "unclaimed",
          "returned",
          "failed"
        ],
        "title": "AffiliatePayoutStatus",
        "type": "string"
      },
      "AffiliatePerformanceReadSchema": {
        "description": "Everything the affiliate overview measures over one window.",
        "properties": {
          "active_count": {
            "description": "Referrals still inside their commission window.",
            "title": "Active Count",
            "type": "integer"
          },
          "average_commission_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Lifetime gross commission per paying referral. Null with none yet.",
            "title": "Average Commission Cents"
          },
          "clears_minimum_on": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The day the payable balance first clears the payout minimum on that schedule. Null when it already has, or when it never does.",
            "title": "Clears Minimum On"
          },
          "clicks": {
            "$ref": "#/components/schemas/AffiliateTrendReadSchema"
          },
          "conversion_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Paying referrals per signup, lifetime, 0-1. Null below the honesty floor.",
            "title": "Conversion Rate"
          },
          "conversions": {
            "$ref": "#/components/schemas/AffiliateTrendReadSchema"
          },
          "days": {
            "description": "The window length these figures cover.",
            "title": "Days",
            "type": "integer"
          },
          "earned_cents": {
            "$ref": "#/components/schemas/AffiliateTrendReadSchema"
          },
          "epc_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Commission earned per click over the window. Null below the honesty floor.",
            "title": "Epc Cents"
          },
          "held_cents": {
            "description": "Money in a payout waiting on human review. Still counted in the available balance until it is released.",
            "title": "Held Cents",
            "type": "integer"
          },
          "last_commission_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Commission At"
          },
          "last_conversion_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Conversion At"
          },
          "last_signup_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Signup At"
          },
          "lifetime_clawed_back_cents": {
            "description": "What refunds and disputes took back, as a positive magnitude.",
            "title": "Lifetime Clawed Back Cents",
            "type": "integer"
          },
          "lifetime_gross_cents": {
            "title": "Lifetime Gross Cents",
            "type": "integer"
          },
          "lifetime_net_cents": {
            "title": "Lifetime Net Cents",
            "type": "integer"
          },
          "never_paid_count": {
            "description": "Referrals that have not started a paid plan.",
            "title": "Never Paid Count",
            "type": "integer"
          },
          "next_payout_blocker": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When blocked, which gate: identity_not_verified, no_payout_email or destination_hold.",
            "title": "Next Payout Blocker"
          },
          "next_payout_cents": {
            "description": "What that run would send on today's numbers plus what matures before it.",
            "title": "Next Payout Cents",
            "type": "integer"
          },
          "next_payout_on": {
            "description": "The date of the next monthly payout run.",
            "format": "date",
            "title": "Next Payout On",
            "type": "string"
          },
          "next_payout_status": {
            "$ref": "#/components/schemas/AffiliateNextPayoutStatus",
            "description": "Whether that run will actually send anything: scheduled, below the minimum, blocked on a step the affiliate can take, under human review, paused program-wide, or unavailable to this account."
          },
          "signup_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Signups per click over the window, 0-1. Null when there were too few clicks for the figure to mean anything.",
            "title": "Signup Rate"
          },
          "signups": {
            "$ref": "#/components/schemas/AffiliateTrendReadSchema"
          },
          "upcoming_maturities": {
            "description": "The next days pending commission becomes payable on, soonest first.",
            "items": {
              "$ref": "#/components/schemas/AffiliateMaturityReadSchema"
            },
            "title": "Upcoming Maturities",
            "type": "array"
          },
          "window_closed_count": {
            "description": "Referrals whose commission window has ended.",
            "title": "Window Closed Count",
            "type": "integer"
          }
        },
        "required": [
          "days",
          "clicks",
          "signups",
          "conversions",
          "earned_cents",
          "signup_rate",
          "conversion_rate",
          "epc_cents",
          "average_commission_cents",
          "lifetime_gross_cents",
          "lifetime_clawed_back_cents",
          "lifetime_net_cents",
          "never_paid_count",
          "active_count",
          "window_closed_count",
          "upcoming_maturities",
          "clears_minimum_on",
          "next_payout_on",
          "next_payout_cents",
          "next_payout_status",
          "next_payout_blocker",
          "held_cents",
          "last_signup_at",
          "last_conversion_at",
          "last_commission_at"
        ],
        "title": "AffiliatePerformanceReadSchema",
        "type": "object"
      },
      "AffiliateProfileReadSchema": {
        "description": "The caller's own standing in the affiliate program.",
        "properties": {
          "contact_email": {
            "title": "Contact Email",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "identity_verified_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Identity Verified At"
          },
          "paypal_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Paypal Email"
          },
          "paypal_email_confirmed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Paypal Email Confirmed At"
          },
          "status": {
            "$ref": "#/components/schemas/AffiliateStatus"
          }
        },
        "required": [
          "id",
          "status",
          "display_name",
          "contact_email",
          "identity_verified_at",
          "paypal_email",
          "paypal_email_confirmed_at",
          "created_at"
        ],
        "title": "AffiliateProfileReadSchema",
        "type": "object"
      },
      "AffiliateProgramReadSchema": {
        "description": "What the affiliate program pays right now: the public half of the offer.",
        "properties": {
          "conversion_deadline_days": {
            "description": "Days after signup within which a referral must start paying for the stamped terms to hold; later conversions earn the standard schedule.",
            "title": "Conversion Deadline Days",
            "type": "integer"
          },
          "duration_months": {
            "description": "How many months of that customer's payments the rate applies to.",
            "title": "Duration Months",
            "type": "integer"
          },
          "launch_offer_active": {
            "description": "Whether the launch offer currently applies.",
            "title": "Launch Offer Active",
            "type": "boolean"
          },
          "launch_offer_ends_on": {
            "description": "The last day of the launch offer, unless ended earlier.",
            "format": "date",
            "title": "Launch Offer Ends On",
            "type": "string"
          },
          "payout_minimum_cents": {
            "description": "Available balance, in USD cents, below which a monthly payout rolls over.",
            "title": "Payout Minimum Cents",
            "type": "integer"
          },
          "pending_days": {
            "description": "How long an earned commission stays pending before it is payable.",
            "title": "Pending Days",
            "type": "integer"
          },
          "rate_bps": {
            "description": "Commission rate a customer attributed today is stamped with, in basis points.",
            "title": "Rate Bps",
            "type": "integer"
          },
          "standard_duration_months": {
            "description": "The standard duration, in months, outside the launch offer.",
            "title": "Standard Duration Months",
            "type": "integer"
          },
          "standard_rate_bps": {
            "description": "The standard rate, in basis points, outside the launch offer.",
            "title": "Standard Rate Bps",
            "type": "integer"
          }
        },
        "required": [
          "rate_bps",
          "duration_months",
          "standard_rate_bps",
          "standard_duration_months",
          "launch_offer_active",
          "launch_offer_ends_on",
          "conversion_deadline_days",
          "pending_days",
          "payout_minimum_cents"
        ],
        "title": "AffiliateProgramReadSchema",
        "type": "object"
      },
      "AffiliateReferralReadSchema": {
        "description": "One referred workspace, anonymized, with its own terms and earnings.",
        "properties": {
          "clawed_back_cents": {
            "description": "What refunds and disputes took back off it, as a positive magnitude.",
            "title": "Clawed Back Cents",
            "type": "integer"
          },
          "commission_months": {
            "description": "How many months this referral pays commission for.",
            "title": "Commission Months",
            "type": "integer"
          },
          "commission_rate_bps": {
            "description": "The rate stamped on THIS referral, which the program's current offer does not change.",
            "title": "Commission Rate Bps",
            "type": "integer"
          },
          "commission_window_ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this referral stops earning; null until it converts.",
            "title": "Commission Window Ends At"
          },
          "converted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this referral first started paying; null while still on the free plan.",
            "title": "Converted At"
          },
          "earned_cents": {
            "description": "Gross commission this referral has produced.",
            "title": "Earned Cents",
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_payment_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Payment At"
          },
          "payment_count": {
            "description": "How many commission payments it has produced.",
            "title": "Payment Count",
            "type": "integer"
          },
          "signed_up_at": {
            "format": "date-time",
            "title": "Signed Up At",
            "type": "string"
          },
          "source": {
            "description": "The link tag this referral arrived under, if any.",
            "title": "Source",
            "type": "string"
          }
        },
        "required": [
          "id",
          "source",
          "commission_rate_bps",
          "commission_months",
          "signed_up_at",
          "converted_at",
          "commission_window_ends_at",
          "earned_cents",
          "clawed_back_cents",
          "payment_count",
          "last_payment_at"
        ],
        "title": "AffiliateReferralReadSchema",
        "type": "object"
      },
      "AffiliateSettingsReadSchema": {
        "description": "What the affiliate has set for themselves: where payouts go and the custom code.",
        "properties": {
          "paypal_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The PayPal account payouts are sent to.",
            "title": "Paypal Email"
          },
          "paypal_email_confirmed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the payout email was last set; the destination hold counts from it.",
            "title": "Paypal Email Confirmed At"
          },
          "vanity_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The claimed custom code, when one exists.",
            "title": "Vanity Code"
          }
        },
        "required": [
          "paypal_email",
          "paypal_email_confirmed_at",
          "vanity_code"
        ],
        "title": "AffiliateSettingsReadSchema",
        "type": "object"
      },
      "AffiliateSettingsUpdateSchema": {
        "description": "The settings an affiliate changes. Send the ones to change; at least one.",
        "properties": {
          "paypal_email": {
            "anyOf": [
              {
                "format": "email",
                "maxLength": 320,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The PayPal account payouts are sent to. Setting a different address restarts the destination hold.",
            "title": "Paypal Email"
          },
          "vanity_code": {
            "anyOf": [
              {
                "maxLength": 32,
                "minLength": 4,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The affiliate's one custom code: 4-32 lowercase letters, digits or hyphens. It is claimed once and cannot be changed after.",
            "title": "Vanity Code"
          }
        },
        "title": "AffiliateSettingsUpdateSchema",
        "type": "object"
      },
      "AffiliateSourceStatReadSchema": {
        "description": "How one traffic source the affiliate tagged has performed.",
        "properties": {
          "clicks": {
            "title": "Clicks",
            "type": "integer"
          },
          "earned_cents": {
            "title": "Earned Cents",
            "type": "integer"
          },
          "paying": {
            "title": "Paying",
            "type": "integer"
          },
          "signups": {
            "title": "Signups",
            "type": "integer"
          },
          "source": {
            "description": "The affiliate's own link tag; empty string for untagged traffic.",
            "title": "Source",
            "type": "string"
          }
        },
        "required": [
          "source",
          "clicks",
          "signups",
          "paying",
          "earned_cents"
        ],
        "title": "AffiliateSourceStatReadSchema",
        "type": "object"
      },
      "AffiliateStatsReadSchema": {
        "description": "The affiliate dashboard's headline numbers.",
        "properties": {
          "available_cents": {
            "description": "Payable balance; negative when clawbacks exceed earnings.",
            "title": "Available Cents",
            "type": "integer"
          },
          "click_count": {
            "description": "Deduplicated, bot-filtered clicks on the affiliate's links.",
            "title": "Click Count",
            "type": "integer"
          },
          "lifetime_earned_cents": {
            "description": "All commission ever accrued.",
            "title": "Lifetime Earned Cents",
            "type": "integer"
          },
          "lifetime_paid_cents": {
            "description": "All payouts ever sent.",
            "title": "Lifetime Paid Cents",
            "type": "integer"
          },
          "paying_count": {
            "description": "Of those, how many are on a paid plan.",
            "title": "Paying Count",
            "type": "integer"
          },
          "pending_cents": {
            "description": "Commission still inside the pending window.",
            "title": "Pending Cents",
            "type": "integer"
          },
          "registered_count": {
            "description": "Workspaces that signed up through the links.",
            "title": "Registered Count",
            "type": "integer"
          }
        },
        "required": [
          "click_count",
          "registered_count",
          "paying_count",
          "pending_cents",
          "available_cents",
          "lifetime_earned_cents",
          "lifetime_paid_cents"
        ],
        "title": "AffiliateStatsReadSchema",
        "type": "object"
      },
      "AffiliateStatus": {
        "description": "Whether an affiliate may earn and be paid.",
        "enum": [
          "active",
          "suspended",
          "banned"
        ],
        "title": "AffiliateStatus",
        "type": "string"
      },
      "AffiliateSummaryReadSchema": {
        "description": "Everything the affiliate dashboard's overview needs in one read.",
        "properties": {
          "code": {
            "description": "The minted default code.",
            "title": "Code",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "link": {
            "description": "The full URL to share, using the vanity code when claimed.",
            "title": "Link",
            "type": "string"
          },
          "profile": {
            "$ref": "#/components/schemas/AffiliateProfileReadSchema"
          },
          "program": {
            "$ref": "#/components/schemas/AffiliateProgramReadSchema"
          },
          "stats": {
            "$ref": "#/components/schemas/AffiliateStatsReadSchema"
          },
          "status": {
            "$ref": "#/components/schemas/AffiliateStatus"
          },
          "vanity_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The claimed custom code, when one exists.",
            "title": "Vanity Code"
          }
        },
        "required": [
          "status",
          "display_name",
          "code",
          "vanity_code",
          "link",
          "stats",
          "program",
          "profile"
        ],
        "title": "AffiliateSummaryReadSchema",
        "type": "object"
      },
      "AffiliateTrendReadSchema": {
        "description": "One metric over a window, against the window immediately before it.",
        "properties": {
          "current": {
            "title": "Current",
            "type": "integer"
          },
          "previous": {
            "title": "Previous",
            "type": "integer"
          }
        },
        "required": [
          "current",
          "previous"
        ],
        "title": "AffiliateTrendReadSchema",
        "type": "object"
      },
      "AgentAttemptAnswerSchema": {
        "description": "What the browser does with a step after one of its runs was cut off.",
        "properties": {
          "attempt": {
            "description": "Which attempt this was.",
            "title": "Attempt",
            "type": "integer"
          },
          "attempts_left": {
            "description": "How many counted attempts remain before the step stops.",
            "title": "Attempts Left",
            "type": "integer"
          },
          "claim_expires_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The claim's lease, extended, read against server_now; null unless it goes on.",
            "title": "Claim Expires At"
          },
          "next_run_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The run that may press now; null unless the step goes on.",
            "title": "Next Run Id"
          },
          "server_now": {
            "description": "The server's clock when it answered.",
            "format": "date-time",
            "title": "Server Now",
            "type": "string"
          },
          "verdict": {
            "$ref": "#/components/schemas/LinkedInAttemptVerdict",
            "description": "retry: run it again as next_run_id. look_first: run it again, looking on LinkedIn before any press (verification). stop: it was cut off too often and is settled failed; post nothing. lost: the claim is not this browser's any more; post nothing. not_retryable: the exit is not an interruption, or a press LinkedIn never answered (or a page that never drew) reached the cap; post the result."
          },
          "verification": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentAttemptVerificationSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "For look_first: what to look for before acting; null otherwise."
          }
        },
        "required": [
          "verdict",
          "attempt",
          "attempts_left",
          "next_run_id",
          "claim_expires_at",
          "server_now",
          "verification"
        ],
        "title": "AgentAttemptAnswerSchema",
        "type": "object"
      },
      "AgentAttemptSchema": {
        "description": "A run of the held step cut off without an error from LinkedIn, reported instead of a result.\n\nThe same report again (the same ``stopped_run_id``) gets the same answer and\nchanges nothing, so a report that got no answer is sent again with the same\nids until it does.",
        "properties": {
          "cause": {
            "description": "Why the run stopped: person_closed (a person closed the working tab), worker_restarted, page_not_loaded, tab_frozen, identity_no_answer, no_response (LinkedIn never answered a press, or did not say whether it acted), or outage (the server could not be asked). Every cause but person_closed and outage counts against the step. A no_response run, or a page_unsettled one, that reaches the cap is answered not_retryable, and its own failure is posted.",
            "enum": [
              "person_closed",
              "worker_restarted",
              "page_not_loaded",
              "tab_frozen",
              "identity_no_answer",
              "no_response",
              "outage"
            ],
            "title": "Cause",
            "type": "string"
          },
          "claimed_at": {
            "description": "The step's claim, exactly as the claim handed it out.",
            "format": "date-time",
            "title": "Claimed At",
            "type": "string"
          },
          "duration_ms": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How long the stopped run lasted.",
            "title": "Duration Ms"
          },
          "next_run_id": {
            "description": "The run the step goes on in, named by this browser before it reports.",
            "maxLength": 64,
            "minLength": 8,
            "pattern": "^[A-Za-z0-9_-]+$",
            "title": "Next Run Id",
            "type": "string"
          },
          "press_granted": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether a press was let through in the stopped run: false when no grant reached it, so it pressed nothing, and a grant first given to it is taken back; null when the browser cannot say.",
            "title": "Press Granted"
          },
          "site": {
            "anyOf": [
              {
                "pattern": "^[a-z][a-z0-9_]{0,63}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the run stopped, a failure_sites.json name; null for an outage.",
            "title": "Site"
          },
          "stopped_run_id": {
            "description": "The run that stopped: the one the press fence may name.",
            "maxLength": 64,
            "minLength": 8,
            "pattern": "^[A-Za-z0-9_-]+$",
            "title": "Stopped Run Id",
            "type": "string"
          }
        },
        "required": [
          "claimed_at",
          "stopped_run_id",
          "next_run_id",
          "cause"
        ],
        "title": "AgentAttemptSchema",
        "type": "object"
      },
      "AgentAttemptVerificationSchema": {
        "description": "What the next run looks for on LinkedIn before it presses anything.",
        "properties": {
          "commit_granted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a press was first granted; null when none was.",
            "title": "Commit Granted At"
          },
          "mode": {
            "$ref": "#/components/schemas/LinkedInLookMode",
            "description": "verify_then_act: look first, finish it if it is not done. verify_only: look and report, never press."
          }
        },
        "required": [
          "mode",
          "commit_granted_at"
        ],
        "title": "AgentAttemptVerificationSchema",
        "type": "object"
      },
      "AgentCommitGrantSchema": {
        "properties": {
          "claim_expires_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Granted: press before this, read against server_now, or ask again.",
            "title": "Claim Expires At"
          },
          "granted": {
            "description": "Whether the run may press now.",
            "title": "Granted",
            "type": "boolean"
          },
          "refusal": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInCommitRefusal"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why not: lost (the claim is not this browser's any more), expired (its lease ran out), stale_run (another run of it holds the grant), requeue_at_reset (the day's limit is spent; the step waits for the reset and never fails for it), wait_for_replies (a message not pressed yet while its sender's inbox goes unread or its member's reply waits to be read; back in line, never failed for it)."
          },
          "server_now": {
            "description": "The server's clock when it answered.",
            "format": "date-time",
            "title": "Server Now",
            "type": "string"
          }
        },
        "required": [
          "granted",
          "refusal",
          "claim_expires_at",
          "server_now"
        ],
        "title": "AgentCommitGrantSchema",
        "type": "object"
      },
      "AgentCommitSchema": {
        "properties": {
          "claimed_at": {
            "description": "The step's claim, exactly as the claim handed it out.",
            "format": "date-time",
            "title": "Claimed At",
            "type": "string"
          },
          "key": {
            "description": "Which control is about to be pressed, e.g. send or connect; for the logs.",
            "pattern": "^[a-z][a-z0-9_]{0,31}$",
            "title": "Key",
            "type": "string"
          },
          "run_id": {
            "description": "This browser's run of the step. A new run is started for every resume, and only one run of a claim may press.",
            "maxLength": 64,
            "minLength": 8,
            "pattern": "^[A-Za-z0-9_-]+$",
            "title": "Run Id",
            "type": "string"
          }
        },
        "required": [
          "claimed_at",
          "run_id",
          "key"
        ],
        "title": "AgentCommitSchema",
        "type": "object"
      },
      "AgentConfidence": {
        "description": "The agent's own read on how solid its final answer is.",
        "enum": [
          "high",
          "medium",
          "low"
        ],
        "title": "AgentConfidence",
        "type": "string"
      },
      "AgentContextSection": {
        "description": "One section of the org's AI business context a prompt can reference.\n\n``ALL`` is the whole context document; the rest are its named sections.",
        "enum": [
          "all",
          "company",
          "icp",
          "personas",
          "signals",
          "social_proof"
        ],
        "title": "AgentContextSection",
        "type": "string"
      },
      "AgentDiagnosticStoredSchema": {
        "description": "Whether a page snapshot was kept.",
        "properties": {
          "stored": {
            "description": "False when there was no report to attach it to, or a recent one already carries the same evidence.",
            "title": "Stored",
            "type": "boolean"
          }
        },
        "required": [
          "stored"
        ],
        "title": "AgentDiagnosticStoredSchema",
        "type": "object"
      },
      "AgentDiagnosticSummarySchema": {
        "description": "The small, typed half of a page report, carried on a step's result.\n\nFiled where the browser decided something from what it could not find. The\nsnapshot of the page follows on its own request, so a report can never\ncost the result it rides with.",
        "properties": {
          "before_commit": {
            "default": false,
            "description": "The browser's word that nothing changed on LinkedIn: it pressed no button that sends, follows, likes or withdraws.",
            "title": "Before Commit",
            "type": "boolean"
          },
          "checkpoint": {
            "description": "Where in the step the browser stood, e.g. more_menu.",
            "pattern": "^[a-z][a-z0-9_]{0,63}$",
            "title": "Checkpoint",
            "type": "string"
          },
          "config_version": {
            "anyOf": [
              {
                "maximum": 2147483647.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The selector config version the browser ran.",
            "title": "Config Version"
          },
          "trigger": {
            "$ref": "#/components/schemas/LinkedInDiagnosticTrigger",
            "description": "Why the report was filed."
          }
        },
        "required": [
          "trigger",
          "checkpoint"
        ],
        "title": "AgentDiagnosticSummarySchema",
        "type": "object"
      },
      "AgentEffortLevel": {
        "description": "How hard the Agent works on each row.\n\nNamed levels rather than raw step counts: the level is the user-facing\ncontract, and what each level buys (step and page budgets) is a product\ndecision the loop maps internally. Re-tuning budgets never invalidates\nstored columns.",
        "enum": [
          "low",
          "standard",
          "high"
        ],
        "title": "AgentEffortLevel",
        "type": "string"
      },
      "AgentHeartbeatSchema": {
        "properties": {
          "checkpoint": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True when LinkedIn is challenging the account; no work is handed out while it stands. False clears it; null leaves it untouched.",
            "title": "Checkpoint"
          },
          "extension_version": {
            "default": "",
            "maxLength": 32,
            "title": "Extension Version",
            "type": "string"
          },
          "lease_nonce": {
            "description": "This browser's lease identity; only the holder is handed work.",
            "maxLength": 64,
            "minLength": 8,
            "title": "Lease Nonce",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who the browser is currently signed in as, for the mismatch guard.",
            "title": "Member Urn"
          },
          "running_action_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step this browser is running right now, sent on the check-ins it makes while it runs; with running_claimed_at it keeps that step's claim from lapsing under a browser still working on it, including one waking from sleep. Null between steps.",
            "title": "Running Action Id"
          },
          "running_claimed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the running step was claimed, as the claim handed it out.",
            "title": "Running Claimed At"
          },
          "running_phase": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInRunPhase"
              },
              {
                "type": "null"
              }
            ],
            "description": "How far the running step got, from a build that resumes steps (resume:v1). Reported to the team for a step that never ends (read on /heartbeat/ only), and not kept: the commit grant, not the phase, says whether anything may have changed on LinkedIn."
          },
          "running_wait": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentRunningWaitSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the running step is waiting on right now; read on /heartbeat/ only, and not kept. One wait past every ceiling (twice the longest a whole step can take) is one nothing will end: the step's claim is taken back, counted against the step as a lapse is, and running_claim answers lost. Reported to the team, as is a step that goes on after it was told its claim is gone."
          },
          "supported_kinds": {
            "anyOf": [
              {
                "items": {
                  "maxLength": 64,
                  "minLength": 1,
                  "type": "string"
                },
                "maxItems": 64,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step kinds this build can run, and the capabilities it has beyond them (such as profile_view:read_relationship). Nothing is handed to a browser that it cannot run. Leave it out (an older build) and the browser runs the kinds that existed before builds said. Sent on every check-in: a check-in without it reads as such a build.",
            "title": "Supported Kinds"
          },
          "timezone": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The browser's IANA timezone (Intl.DateTimeFormat().resolvedOptions().timeZone). It fills the sender's timezone when the sender has none: their daily limits reset at its midnight and sequences send in its hours. A timezone the sender has is never moved by it. Taken only from the browser driving the account.",
            "title": "Timezone"
          }
        },
        "required": [
          "lease_nonce"
        ],
        "title": "AgentHeartbeatSchema",
        "type": "object"
      },
      "AgentInputMappingSuggestionSchema": {
        "description": "One suggested table column for an agent input.",
        "properties": {
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Column Id"
          },
          "column_is_empty": {
            "default": false,
            "description": "True when the suggested column holds no data in this table: runs would skip every row until it is filled or remapped.",
            "title": "Column Is Empty",
            "type": "boolean"
          },
          "input_id": {
            "description": "The declared input this suggestion binds: the deploy request's key.",
            "format": "uuid",
            "title": "Input Id",
            "type": "string"
          },
          "input_name": {
            "description": "The input's display name, the label the mapping row shows.",
            "title": "Input Name",
            "type": "string"
          }
        },
        "required": [
          "input_id",
          "input_name",
          "column_id"
        ],
        "title": "AgentInputMappingSuggestionSchema",
        "type": "object"
      },
      "AgentInputMappingSuggestionsResponseSchema": {
        "description": "Suggested input\u2192column mappings for deploying an agent onto a table.",
        "properties": {
          "suggestions": {
            "items": {
              "$ref": "#/components/schemas/AgentInputMappingSuggestionSchema"
            },
            "title": "Suggestions",
            "type": "array"
          }
        },
        "required": [
          "suggestions"
        ],
        "title": "AgentInputMappingSuggestionsResponseSchema",
        "type": "object"
      },
      "AgentInputSchema": {
        "description": "One named input a saved agent declares.\n\nThe id is client-minted at declaration time (the editor must be able to\nreference a fresh input before the first save) and is the identity the\nprompt's ``input_ref`` segments and a deployment's mapping key on.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "AgentInputSchema",
        "type": "object"
      },
      "AgentLearningBulkPromoteResponseSchema": {
        "description": "What keeping a shared rule once, for all sequences, did.",
        "properties": {
          "learning": {
            "$ref": "#/components/schemas/AgentLearningReadSchema",
            "description": "The rule as all sequences keep it (on a dry run, would keep it)."
          },
          "updated": {
            "description": "How many copies this call moved or removed (on a dry run, would): the newest moved unless all sequences keep it already, and the rest removed. A copy edited meanwhile stays, and is not counted.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "learning"
        ],
        "title": "AgentLearningBulkPromoteResponseSchema",
        "type": "object"
      },
      "AgentLearningCreateSchema": {
        "description": "A learning a person writes, and who keeps it (F5).",
        "properties": {
          "account": {
            "default": false,
            "description": "Every sequence's writer keeps it (All sequences).",
            "title": "Account",
            "type": "boolean"
          },
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A table column: the agent it runs keeps it, its saved agent's when it is linked to one, else its own.",
            "title": "Column Id"
          },
          "saved_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The saved agent that keeps it, a table agent or a sequence's.",
            "title": "Saved Agent Id"
          },
          "text": {
            "description": "The rule, one line; line breaks are folded into spaces.",
            "maxLength": 300,
            "minLength": 1,
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "AgentLearningCreateSchema",
        "type": "object"
      },
      "AgentLearningMoveSchema": {
        "description": "Move a saved learning between one sequence and every sequence.",
        "properties": {
          "saved_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sequence's outbound agent, for `sequence`. Ignored for `account`.",
            "title": "Saved Agent Id"
          },
          "scope": {
            "$ref": "#/components/schemas/ProposedScope",
            "description": "`account` for every sequence; `sequence` for one sequence only."
          }
        },
        "required": [
          "scope"
        ],
        "title": "AgentLearningMoveSchema",
        "type": "object"
      },
      "AgentLearningPromoteSchema": {
        "description": "Keep a rule several sequences share once, for all sequences.",
        "properties": {
          "ids": {
            "description": "The rule's copies, as the overlap lists them (`learning_ids`).",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 500,
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "title": "AgentLearningPromoteSchema",
        "type": "object"
      },
      "AgentLearningReadSchema": {
        "description": "One learning: a one-line rule the agent follows on every output.",
        "properties": {
          "all_sequences": {
            "default": false,
            "description": "Whether every sequence's writer follows it, rather than one agent.",
            "title": "All Sequences",
            "type": "boolean"
          },
          "batch_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The release that wrote it, for a learning split from a long prompt (`simplified`) or carried over from old feedback (`carried`): undoing that event (POST /agent-learnings/thumbs-downs/{event_id}/revert/ with this id) is Put back the original prompt. Null for a learning a thumbs down taught.",
            "title": "Batch Id"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who taught it, or null for a release.",
            "title": "Created By User Id"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_event_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The latest thumbs down that wrote it, for Undo (POST /agent-learnings/thumbs-downs/{event_id}/revert/); null when none did or the learning was only read.",
            "title": "Last Event Id"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the person said in the thumbs down that last wrote it (`last_event_id`), every note of a refined one joined, one per line; null when no thumbs down did, and once its feedback session closed: a saved, discarded or undone session keeps none of the person's notes.",
            "title": "Note"
          },
          "note_surface": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LearningSource"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the thumbs down that last wrote it (`last_event_id`) was given, which `note` and `source_text` come from; it can differ from `source` once a later thumbs down on another surface changed it. Null when no thumbs down did."
          },
          "noted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When that thumbs down was given; null when no thumbs down wrote it.",
            "title": "Noted At"
          },
          "notes": {
            "description": "The same notes one by one, oldest first, each whole: the thumbs down's own, then each further note in its session. Empty when no thumbs down wrote it, and once its feedback session closed.",
            "items": {
              "type": "string"
            },
            "title": "Notes",
            "type": "array"
          },
          "repeats": {
            "default": 0,
            "description": "How often a later Needs work asked for it again, as it stood, once saved; 0 when none did.",
            "title": "Repeats",
            "type": "integer"
          },
          "source": {
            "$ref": "#/components/schemas/LearningSource",
            "description": "Where it was taught: the surface whose thumbs down added it, `simplified` when a long prompt was split into a goal and learnings, `carried` when old feedback was carried over."
          },
          "source_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The message that thumbs down was given on, as it read then; null when none was kept (a table agent's, or a learning a release wrote).",
            "title": "Source Text"
          },
          "step_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The one step of the sequence it holds for, by the step's agent prompt slot; null when it holds for every message the agent writes.",
            "title": "Step Key"
          },
          "step_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "That step as the sequence names it now, e.g. \"Step 2 \u00b7 Follow up\"; null when it holds for every message, or the step is gone.",
            "title": "Step Label"
          },
          "text": {
            "description": "The rule, one line.",
            "title": "Text",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "text",
          "source",
          "created_at",
          "updated_at",
          "created_by_user_id",
          "last_event_id",
          "batch_id"
        ],
        "title": "AgentLearningReadSchema",
        "type": "object"
      },
      "AgentLearningUpdateSchema": {
        "description": "A learning rewritten by hand.",
        "properties": {
          "text": {
            "description": "The rule, one line; line breaks are folded into spaces.",
            "maxLength": 300,
            "minLength": 1,
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "AgentLearningUpdateSchema",
        "type": "object"
      },
      "AgentMcpServersPutSchema": {
        "description": "The exact set of MCP servers an agent should have attached.",
        "properties": {
          "server_ids": {
            "description": "The servers to attach to the agent; replaces the current set.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 20,
            "title": "Server Ids",
            "type": "array"
          }
        },
        "title": "AgentMcpServersPutSchema",
        "type": "object"
      },
      "AgentMcpServersSetSchema": {
        "description": "The MCP servers attached to a saved agent: the whole set, alphabetical.",
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/McpServerReadSchema"
            },
            "title": "Data",
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "title": "AgentMcpServersSetSchema",
        "type": "object"
      },
      "AgentNextActionSchema": {
        "properties": {
          "action": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInActionReadSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "deferred_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Deferred Reason"
          },
          "earliest_next_action_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Earliest Next Action At"
          },
          "queued_count": {
            "title": "Queued Count",
            "type": "integer"
          },
          "verification": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentVerificationSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set when the step handed out may already have touched LinkedIn (it stopped and was put back, or a press was granted to an earlier attempt): look on LinkedIn before acting, and a change already there is the step done. Only builds that resume steps (resume:v1) are handed such a step."
          }
        },
        "required": [
          "action",
          "earliest_next_action_at",
          "queued_count",
          "deferred_reason"
        ],
        "title": "AgentNextActionSchema",
        "type": "object"
      },
      "AgentNextRequestSchema": {
        "properties": {
          "checkpoint": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True when LinkedIn is challenging the account; no work is handed out while it stands. False clears it; null leaves it untouched.",
            "title": "Checkpoint"
          },
          "claim_request_id": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 8,
                "pattern": "^[A-Za-z0-9_-]+$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "This browser's name for this ask, kept until the answer is saved. Asked again under the same name, because the first answer never arrived, the browser gets the step it was handed rather than a second one beside it. Older builds leave it out.",
            "title": "Claim Request Id"
          },
          "extension_version": {
            "default": "",
            "maxLength": 32,
            "title": "Extension Version",
            "type": "string"
          },
          "lease_nonce": {
            "description": "This browser's lease identity; only the holder is handed work.",
            "maxLength": 64,
            "minLength": 8,
            "title": "Lease Nonce",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who the browser is currently signed in as, for the mismatch guard.",
            "title": "Member Urn"
          },
          "running_action_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step this browser is running right now, sent on the check-ins it makes while it runs; with running_claimed_at it keeps that step's claim from lapsing under a browser still working on it, including one waking from sleep. Null between steps.",
            "title": "Running Action Id"
          },
          "running_claimed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the running step was claimed, as the claim handed it out.",
            "title": "Running Claimed At"
          },
          "running_phase": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInRunPhase"
              },
              {
                "type": "null"
              }
            ],
            "description": "How far the running step got, from a build that resumes steps (resume:v1). Reported to the team for a step that never ends (read on /heartbeat/ only), and not kept: the commit grant, not the phase, says whether anything may have changed on LinkedIn."
          },
          "running_wait": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentRunningWaitSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the running step is waiting on right now; read on /heartbeat/ only, and not kept. One wait past every ceiling (twice the longest a whole step can take) is one nothing will end: the step's claim is taken back, counted against the step as a lapse is, and running_claim answers lost. Reported to the team, as is a step that goes on after it was told its claim is gone."
          },
          "supported_kinds": {
            "anyOf": [
              {
                "items": {
                  "maxLength": 64,
                  "minLength": 1,
                  "type": "string"
                },
                "maxItems": 64,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step kinds this build can run, and the capabilities it has beyond them (such as profile_view:read_relationship). Nothing is handed to a browser that it cannot run. Leave it out (an older build) and the browser runs the kinds that existed before builds said. Sent on every check-in: a check-in without it reads as such a build.",
            "title": "Supported Kinds"
          },
          "timezone": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The browser's IANA timezone (Intl.DateTimeFormat().resolvedOptions().timeZone). It fills the sender's timezone when the sender has none: their daily limits reset at its midnight and sequences send in its hours. A timezone the sender has is never moved by it. Taken only from the browser driving the account.",
            "title": "Timezone"
          },
          "unmetered_only": {
            "default": false,
            "description": "Hand out only a step that waits for no gap between steps (one the Oneprofile team fired to test the sender), or nothing: the ask a build makes inside its own gap when the check-in says one is waiting (unpaced_waiting). Older builds leave it out.",
            "title": "Unmetered Only",
            "type": "boolean"
          }
        },
        "required": [
          "lease_nonce"
        ],
        "title": "AgentNextRequestSchema",
        "type": "object"
      },
      "AgentPairResultSchema": {
        "properties": {
          "account_id": {
            "format": "uuid",
            "title": "Account Id",
            "type": "string"
          },
          "agent_token": {
            "title": "Agent Token",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "run_mode": {
            "$ref": "#/components/schemas/LinkedInApprovalMode",
            "description": "The sender's LinkedIn approval setting in force: manual or auto."
          },
          "sender_profile_id": {
            "format": "uuid",
            "title": "Sender Profile Id",
            "type": "string"
          },
          "session_id": {
            "format": "uuid",
            "title": "Session Id",
            "type": "string"
          }
        },
        "required": [
          "agent_token",
          "session_id",
          "account_id",
          "sender_profile_id",
          "member_urn",
          "display_name",
          "run_mode"
        ],
        "title": "AgentPairResultSchema",
        "type": "object"
      },
      "AgentPairSchema": {
        "description": "The pasted connection token plus what the extension read from the live LinkedIn session.",
        "properties": {
          "browser_label": {
            "default": "",
            "description": "How the dashboard names this browser, e.g. 'Chrome on macOS'.",
            "maxLength": 128,
            "title": "Browser Label",
            "type": "string"
          },
          "connection_token": {
            "maxLength": 128,
            "minLength": 8,
            "title": "Connection Token",
            "type": "string"
          },
          "display_name": {
            "default": "",
            "maxLength": 255,
            "title": "Display Name",
            "type": "string"
          },
          "extension_version": {
            "default": "",
            "maxLength": 32,
            "title": "Extension Version",
            "type": "string"
          },
          "headline": {
            "default": "",
            "maxLength": 500,
            "title": "Headline",
            "type": "string"
          },
          "lease_nonce": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 8,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The lease identity this browser will use with the new session, named before it pairs and kept until a pairing is answered. A live session of the account already carrying it is this same browser's pairing whose answer was lost, and is signed out first, so asking again never leaves a second entry for one browser.",
            "title": "Lease Nonce"
          },
          "member_urn": {
            "maxLength": 128,
            "minLength": 3,
            "title": "Member Urn",
            "type": "string"
          },
          "photo_url": {
            "anyOf": [
              {
                "maxLength": 1000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Photo Url"
          },
          "previous_session_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The session this same browser held before, when it is pairing again. It is signed out first, so re-pairing does not leave a second entry for one browser.",
            "title": "Previous Session Id"
          },
          "supported_kinds": {
            "anyOf": [
              {
                "items": {
                  "maxLength": 64,
                  "minLength": 1,
                  "type": "string"
                },
                "maxItems": 64,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step kinds this build can run, and the capabilities it has beyond them (such as profile_view:read_relationship). Nothing is handed to a browser that it cannot run. Leave it out (an older build) and the browser runs the kinds that existed before builds said.",
            "title": "Supported Kinds"
          },
          "timezone": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The browser's IANA timezone (Intl.DateTimeFormat().resolvedOptions().timeZone). It fills the sender's timezone when the sender has none: their daily limits reset at its midnight and sequences send in its hours. A timezone the sender has is never moved by it. Taken only from the browser driving the account.",
            "title": "Timezone"
          },
          "vanity_name": {
            "default": "",
            "maxLength": 160,
            "title": "Vanity Name",
            "type": "string"
          }
        },
        "required": [
          "connection_token",
          "member_urn"
        ],
        "title": "AgentPairSchema",
        "type": "object"
      },
      "AgentPreviewSubjectSchema": {
        "description": "One row of a table agent's Preview.",
        "properties": {
          "kind": {
            "const": "agent_preview",
            "title": "Kind",
            "type": "string"
          },
          "row_id": {
            "format": "uuid",
            "title": "Row Id",
            "type": "string"
          },
          "saved_agent_id": {
            "format": "uuid",
            "title": "Saved Agent Id",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "saved_agent_id",
          "row_id"
        ],
        "title": "AgentPreviewSubjectSchema",
        "type": "object"
      },
      "AgentPromptContextRefSegment": {
        "description": "A reference to the org's business context, resolved per org.",
        "properties": {
          "section": {
            "$ref": "#/components/schemas/AgentContextSection",
            "default": "all"
          },
          "type": {
            "const": "context_ref",
            "default": "context_ref",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "AgentPromptContextRefSegment",
        "type": "object"
      },
      "AgentPromptInputRefSegment": {
        "description": "A reference to one declared input, resolved per row at run time.",
        "properties": {
          "input_id": {
            "format": "uuid",
            "title": "Input Id",
            "type": "string"
          },
          "type": {
            "const": "input_ref",
            "default": "input_ref",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "input_id"
        ],
        "title": "AgentPromptInputRefSegment",
        "type": "object"
      },
      "AgentPromptTemplate-Input": {
        "description": "A saved agent's prompt: literal text with references between the runs.\n\nThe same convention every other stored prompt in the product uses\n(``EnrichmentPromptTemplate`` for columns, template segments for\nsequences): identity-keyed segments, so renaming what a reference points\nat never rewrites the prompt. Structurally parallel to the enrichment\ntemplate rather than importing it: an agent prompt references INPUTS,\nan enrichment prompt references COLUMNS, and the import hierarchy keeps\nthe two domains apart.",
        "properties": {
          "segments": {
            "items": {
              "discriminator": {
                "mapping": {
                  "context_ref": "#/components/schemas/AgentPromptContextRefSegment",
                  "input_ref": "#/components/schemas/AgentPromptInputRefSegment",
                  "text": "#/components/schemas/AgentPromptTextSegment"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/components/schemas/AgentPromptTextSegment"
                },
                {
                  "$ref": "#/components/schemas/AgentPromptInputRefSegment"
                },
                {
                  "$ref": "#/components/schemas/AgentPromptContextRefSegment"
                }
              ]
            },
            "maxItems": 200,
            "title": "Segments",
            "type": "array"
          }
        },
        "title": "AgentPromptTemplate",
        "type": "object"
      },
      "AgentPromptTemplate-Output": {
        "description": "A saved agent's prompt: literal text with references between the runs.\n\nThe same convention every other stored prompt in the product uses\n(``EnrichmentPromptTemplate`` for columns, template segments for\nsequences): identity-keyed segments, so renaming what a reference points\nat never rewrites the prompt. Structurally parallel to the enrichment\ntemplate rather than importing it: an agent prompt references INPUTS,\nan enrichment prompt references COLUMNS, and the import hierarchy keeps\nthe two domains apart.",
        "properties": {
          "segments": {
            "items": {
              "discriminator": {
                "mapping": {
                  "context_ref": "#/components/schemas/AgentPromptContextRefSegment",
                  "input_ref": "#/components/schemas/AgentPromptInputRefSegment",
                  "text": "#/components/schemas/AgentPromptTextSegment"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/components/schemas/AgentPromptTextSegment"
                },
                {
                  "$ref": "#/components/schemas/AgentPromptInputRefSegment"
                },
                {
                  "$ref": "#/components/schemas/AgentPromptContextRefSegment"
                }
              ]
            },
            "maxItems": 200,
            "title": "Segments",
            "type": "array"
          }
        },
        "title": "AgentPromptTemplate",
        "type": "object"
      },
      "AgentPromptTextSegment": {
        "description": "A literal run of prompt text.",
        "properties": {
          "text": {
            "maxLength": 20000,
            "title": "Text",
            "type": "string"
          },
          "type": {
            "const": "text",
            "default": "text",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "AgentPromptTextSegment",
        "type": "object"
      },
      "AgentReach": {
        "description": "How far a Use AI run may reach beyond the table's own data.\n\nThe price lever and the budget lever both key on this. ``NONE`` is one\nplain completion; ``MCP`` runs the research loop against ONLY the\norg's attached MCP tools (no web-read fees, no page summaries);\n``WEB`` is the full web research loop. A run that has both web and MCP\nexecutes (and bills) as ``WEB``.",
        "enum": [
          "none",
          "mcp",
          "web"
        ],
        "title": "AgentReach",
        "type": "string"
      },
      "AgentRejectSchema": {
        "properties": {
          "reason": {
            "anyOf": [
              {
                "maxLength": 200,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason"
          }
        },
        "title": "AgentRejectSchema",
        "type": "object"
      },
      "AgentReleaseSchema": {
        "properties": {
          "claimed_at": {
            "description": "The step's claim, exactly as the claim handed it out.",
            "format": "date-time",
            "title": "Claimed At",
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/LinkedInReleaseReason",
            "description": "verified_absent (looked, not done, may not finish it now) or reopen_paused (the person closed the tab again). Neither counts against the step: a run cut off under it is reported to the attempts endpoint."
          }
        },
        "required": [
          "claimed_at",
          "reason"
        ],
        "title": "AgentReleaseSchema",
        "type": "object"
      },
      "AgentResultSchema": {
        "description": "What a browser reports back about one action.\n\n``status`` is deliberately NOT the full ``LinkedInActionStatus``: that enum\nincludes ``queued`` and ``claimed``, which are the server's to write, and\n``rejected``, which arrives on its own endpoint because it costs neither\nbudget nor credit. An agent posting one of those used to be written\nstraight through, stamping a non-terminal status with a ``finished_at``.",
        "properties": {
          "claimed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The claim this result is for, exactly as the claim handed it out. A housekeeping read whose claim lapsed goes back on the queue and can be claimed again; a result naming an earlier claim is refused as no longer claimed, unless it is a success for a step not settled since, or the same result again. Absent from older builds.",
            "title": "Claimed At"
          },
          "diagnostic": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentDiagnosticSummarySchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A page report's summary, when the browser decided from something it could not find. It never changes how the step settles. Unreadable summaries are dropped, never refused."
          },
          "duration_ms": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Duration Ms"
          },
          "error_code": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInAgentErrorCode"
              },
              {
                "type": "null"
              }
            ]
          },
          "error_message": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Message"
          },
          "outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInActionOutcome-Input"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "$ref": "#/components/schemas/LinkedInAgentReportableStatus",
            "description": "succeeded | failed | skipped: the terminal state the agent reached."
          }
        },
        "required": [
          "status"
        ],
        "title": "AgentResultSchema",
        "type": "object"
      },
      "AgentRunningWaitSchema": {
        "description": "Where a browser's running step waits, reported to the team for a step that never ends.",
        "properties": {
          "awake_seconds": {
            "description": "How long the innermost wait has run, the browser's sleep left out.",
            "minimum": 0.0,
            "title": "Awake Seconds",
            "type": "integer"
          },
          "site": {
            "description": "The waits the step is inside, outermost first: 'step > navigate > tab.load'.",
            "maxLength": 200,
            "title": "Site",
            "type": "string"
          },
          "tab_discarded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether Chrome discarded the tab.",
            "title": "Tab Discarded"
          },
          "tab_frozen": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether Chrome froze the tab.",
            "title": "Tab Frozen"
          },
          "tab_status": {
            "anyOf": [
              {
                "maxLength": 16,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The working tab's load status as Chrome gives it.",
            "title": "Tab Status"
          }
        },
        "required": [
          "site",
          "awake_seconds"
        ],
        "title": "AgentRunningWaitSchema",
        "type": "object"
      },
      "AgentSendingReadSchema": {
        "properties": {
          "changed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this workspace's switch was last set; null if it never has been.",
            "title": "Changed At"
          },
          "changed_by": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Clerk user id of whoever last set this workspace's switch; null if nobody has.",
            "title": "Changed By"
          },
          "paused": {
            "description": "True when this workspace has paused the replies the agent sends on its own. Replies it writes still wait in Needs approval for a person.",
            "title": "Paused",
            "type": "boolean"
          },
          "paused_everywhere": {
            "description": "True when Oneprofile has paused the agent's own sending for every workspace. Nothing is sent unattended while it is, whatever `paused` says.",
            "title": "Paused Everywhere",
            "type": "boolean"
          }
        },
        "required": [
          "paused",
          "paused_everywhere",
          "changed_by",
          "changed_at"
        ],
        "title": "AgentSendingReadSchema",
        "type": "object"
      },
      "AgentSendingUpdateSchema": {
        "properties": {
          "paused": {
            "description": "True pauses every reply the agent would send on its own; they wait for a person instead. False lets them send again (admins only).",
            "title": "Paused",
            "type": "boolean"
          },
          "reason": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why, kept in the switch's history.",
            "title": "Reason"
          }
        },
        "required": [
          "paused"
        ],
        "title": "AgentSendingUpdateSchema",
        "type": "object"
      },
      "AgentSetStateSchema": {
        "properties": {
          "lease_nonce": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 8,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "This browser's lease identity. When given, lease_granted in the answer says whether this browser holds the lease; when absent it is always true.",
            "title": "Lease Nonce"
          },
          "run_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInApprovalMode"
              },
              {}
            ],
            "description": "The sender's LinkedIn approval setting, as the side panel sets it: the same setting the sender's LinkedIn page sets. Absent leaves it untouched.",
            "title": "Run Mode"
          }
        },
        "title": "AgentSetStateSchema",
        "type": "object"
      },
      "AgentSettings": {
        "description": "Settings for the Agent web-research action.\n\n``starting_url_column_id`` binds a column whose per-row value seeds the\nresearch (stored by identity, like prompt references, so renames are safe\nand deletes are detectable). ``stay_on_domain`` confines every tool that\ntargets a site to that URL's domain and therefore requires a starting URL\nto scope to.\n\nThe two tool toggles are split by what a tool RETURNS, not by how many\ncalls it makes: ``allow_search`` governs discovery (web search and site\nmapping, which return URLs and snippets), ``allow_fetch`` governs content\nreads (scraping one page and crawling several).\n\n``use_row_context`` defaults ON, and a column stored before the field\nexisted decodes to that same default: an investigation whose subject is\nnamed in a column the prompt never mentions is the ordinary case, not the\nexception.\n\n``context`` is deliberately uncapped here. This shape is the run-time\nhandoff into the research loop, and by the time it is built the context\nis ASSEMBLED text: the column's own standing context with the org's\nbusiness context folded onto it. The length cap belongs on what an author\ntypes, and it lives there: on ``UseAISettings.context``, checked when the\ncolumn is saved. Re-checking the assembled string here failed every cell of\na column that was perfectly valid when saved, purely because the org had\nwritten a thorough business context.",
        "properties": {
          "allow_fetch": {
            "default": true,
            "description": "Tool toggle: whether the agent may scrape pages and crawl sites.",
            "title": "Allow Fetch",
            "type": "boolean"
          },
          "allow_search": {
            "default": true,
            "description": "Tool toggle: whether the agent may search the web and map sites.",
            "title": "Allow Search",
            "type": "boolean"
          },
          "context": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Context"
          },
          "effort": {
            "$ref": "#/components/schemas/AgentEffortLevel",
            "default": "standard"
          },
          "kind": {
            "const": "agent",
            "default": "agent",
            "title": "Kind",
            "type": "string"
          },
          "saved_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "An org-level saved agent this column's settings derive from.",
            "title": "Saved Agent Id"
          },
          "starting_url_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A column whose per-row value is the research's starting URL.",
            "title": "Starting Url Column Id"
          },
          "stay_on_domain": {
            "default": false,
            "description": "Whether site-targeting tools are confined to the starting URL's domain.",
            "title": "Stay On Domain",
            "type": "boolean"
          },
          "use_row_context": {
            "default": true,
            "description": "Whether the rest of this row's columns are folded in as context, on top of whatever the prompt itself references.",
            "title": "Use Row Context",
            "type": "boolean"
          }
        },
        "title": "AgentSettings",
        "type": "object"
      },
      "AgentStateSchema": {
        "description": "The authoritative run state, returned on every heartbeat.\n\n``account_mismatch`` is the hard stop: the browser is signed in as somebody\nother than the account we are bound to, and acting would send this customer's\noutreach from the wrong identity.\n\n``run_mode`` is the sender's LinkedIn approval setting in force (manual for\na sender who never set one): the side panel shows it and can change it.\nApproval happens on Oneprofile's Tasks page before a step is queued, so a\nstep handed to the browser runs whichever it says.\n\n``queued_count`` counts steps waiting for a browser, not one running in one.",
        "properties": {
          "account_mismatch": {
            "title": "Account Mismatch",
            "type": "boolean"
          },
          "approvals_waiting": {
            "default": 0,
            "description": "How many of this sender's LinkedIn steps wait for a person on Oneprofile's Tasks page, less those a paused sequence or paused contact holds; the side panel offers Approve tasks while any do.",
            "title": "Approvals Waiting",
            "type": "integer"
          },
          "attempts_enabled": {
            "default": false,
            "description": "Whether a build that reports attempts (attempts:v1) reports a run cut off without an error from LinkedIn to /actions/{id}/attempts/ and runs the step again only on the answer. The same switch as resume_enabled.",
            "title": "Attempts Enabled",
            "type": "boolean"
          },
          "checkpoint": {
            "title": "Checkpoint",
            "type": "boolean"
          },
          "config_version": {
            "description": "The version of the selector and pacing config this server serves. A browser running any other version, older or newer, fetches the config again.",
            "title": "Config Version",
            "type": "integer"
          },
          "lease_granted": {
            "title": "Lease Granted",
            "type": "boolean"
          },
          "lease_holder_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When lease_granted is false, what the browser holding the lease calls itself (for example 'Chrome on macOS'); null when that is not known.",
            "title": "Lease Holder Label"
          },
          "poll_after_seconds": {
            "description": "How long to wait before the next check-in: the account's own time between steps, never more, and never so long the browser stops reading as active. At most 15 seconds while work is about to run (the time between steps is running out, a step may start now, or one is running with more behind it), so a missed wake-up costs seconds rather than a whole interval.",
            "title": "Poll After Seconds",
            "type": "integer"
          },
          "queued_count": {
            "title": "Queued Count",
            "type": "integer"
          },
          "resume_enabled": {
            "default": false,
            "description": "Whether a build that resumes steps (resume:v1) may resume one that stopped without an error from LinkedIn. Off, a stopped step fails for a person to retry, as it did before; the grant and the saved results stay on either way.",
            "title": "Resume Enabled",
            "type": "boolean"
          },
          "run_mode": {
            "$ref": "#/components/schemas/LinkedInApprovalMode"
          },
          "running_claim": {
            "anyOf": [
              {
                "enum": [
                  "renewed",
                  "lost"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a check-in that named a running step: renewed while that claim is still this browser's, lost once it is not (settled, rejected, lapsed while the browser was gone, or taken back from a step whose running_wait outlasted every ceiling), and the browser then stops the step before it changes anything more. Null for a check-in that named none.",
            "title": "Running Claim"
          },
          "unpaced_waiting": {
            "default": false,
            "description": "A step that waits for no gap between steps (one the Oneprofile team fired to test the sender) could be handed out now: ask for it alone (unmetered_only) without waiting out this browser's own gap.",
            "title": "Unpaced Waiting",
            "type": "boolean"
          },
          "usage": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/LinkedInKindUsageReadSchema"
            },
            "title": "Usage",
            "type": "array"
          },
          "usage_resets_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When today's counts in usage start over: 00:00 in the sender's timezone. Older servers leave it out, and a client then reads the next UTC midnight.",
            "title": "Usage Resets At"
          },
          "wait": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInWaitReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the next step is waiting on, and until when, as this browser sees it (another browser holding the lease reads as lease_held_elsewhere); null while nothing is queued."
          }
        },
        "required": [
          "run_mode",
          "checkpoint",
          "lease_granted",
          "account_mismatch",
          "queued_count",
          "poll_after_seconds",
          "config_version"
        ],
        "title": "AgentStateSchema",
        "type": "object"
      },
      "AgentStepAction": {
        "description": "What one agent step did.\n\n``FETCH_PAGE`` is historical: the loop emits ``SCRAPE`` for the same act\ntoday, but stored step traces still carry the old value and must keep\ndeserializing, so the member stays.",
        "enum": [
          "search",
          "fetch_page",
          "map",
          "scrape",
          "crawl",
          "mcp_tool",
          "workspace_action",
          "find_work_email",
          "read_linkedin_profile",
          "find_people_at_company",
          "finish",
          "browser_open",
          "browser_click",
          "browser_type",
          "browser_select",
          "browser_press",
          "browser_wait",
          "browser_back",
          "inbox_find"
        ],
        "title": "AgentStepAction",
        "type": "string"
      },
      "AgentStepOutcome": {
        "description": "How one agent step ended: the structured half of its observation.",
        "enum": [
          "completed",
          "failed",
          "refused"
        ],
        "title": "AgentStepOutcome",
        "type": "string"
      },
      "AgentToolAvailabilitySchema": {
        "description": "Whether one agent tool can be switched on.",
        "properties": {
          "available": {
            "description": "Whether the tool's supplier is available to this organisation; switching the tool on is refused otherwise.",
            "title": "Available",
            "type": "boolean"
          },
          "key": {
            "description": "The tool: 'find_work_email' or 'read_linkedin_profile'.",
            "title": "Key",
            "type": "string"
          }
        },
        "required": [
          "key",
          "available"
        ],
        "title": "AgentToolAvailabilitySchema",
        "type": "object"
      },
      "AgentVerificationSchema": {
        "description": "What to look for on LinkedIn before acting on a step that may already have happened.",
        "properties": {
          "commit_granted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a press was first granted; null when none was or an older build ran it.",
            "title": "Commit Granted At"
          },
          "mode": {
            "$ref": "#/components/schemas/LinkedInLookMode",
            "description": "verify_then_act: look first, finish it if it is not done. verify_only: look and report, never press (its sequence or contact was paused or stopped since it ran)."
          }
        },
        "required": [
          "mode",
          "commit_granted_at"
        ],
        "title": "AgentVerificationSchema",
        "type": "object"
      },
      "AiAppAccess": {
        "description": "What a person let one AI app do in their workspace when they connected it.\n\nChosen on the consent page. A workspace that is not on a paid plan reads\nas READ whatever was chosen, because making changes from an AI app is a\npaid entitlement; that is checked on every call, not stored here.",
        "enum": [
          "read",
          "write"
        ],
        "title": "AiAppAccess",
        "type": "string"
      },
      "AiAppAnswerSchema": {
        "description": "Where to send the person once they have answered.",
        "properties": {
          "redirect_url": {
            "title": "Redirect Url",
            "type": "string"
          }
        },
        "required": [
          "redirect_url"
        ],
        "title": "AiAppAnswerSchema",
        "type": "object"
      },
      "AiAppApproveSchema": {
        "description": "The person's yes: which workspace, and what the app may do there.",
        "properties": {
          "access": {
            "$ref": "#/components/schemas/AiAppAccess"
          },
          "workspace_id": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Workspace Id",
            "type": "string"
          }
        },
        "required": [
          "workspace_id",
          "access"
        ],
        "title": "AiAppApproveSchema",
        "type": "object"
      },
      "AiAppBrand": {
        "description": "Whose mark the dashboard shows beside a connected app.",
        "enum": [
          "claude",
          "chatgpt",
          "other"
        ],
        "title": "AiAppBrand",
        "type": "string"
      },
      "AiAppReadSchema": {
        "description": "An AI app connected to the workspace.",
        "properties": {
          "access": {
            "$ref": "#/components/schemas/AiAppAccess"
          },
          "app_name": {
            "title": "App Name",
            "type": "string"
          },
          "brand": {
            "$ref": "#/components/schemas/AiAppBrand"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_used_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Used At"
          },
          "person_email": {
            "title": "Person Email",
            "type": "string"
          },
          "person_name": {
            "description": "Their full name, or their email when they have none.",
            "title": "Person Name",
            "type": "string"
          },
          "redirect_host": {
            "title": "Redirect Host",
            "type": "string"
          },
          "user_id": {
            "description": "The person who connected it.",
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "app_name",
          "brand",
          "redirect_host",
          "access",
          "user_id",
          "person_name",
          "person_email",
          "last_used_at",
          "created_at"
        ],
        "title": "AiAppReadSchema",
        "type": "object"
      },
      "AiAppRequestReadSchema": {
        "description": "An AI app asking to connect, as the consent page shows it.",
        "properties": {
          "app_name": {
            "description": "What to call the app.",
            "title": "App Name",
            "type": "string"
          },
          "brand": {
            "$ref": "#/components/schemas/AiAppBrand",
            "description": "Whose mark to show beside the name."
          },
          "is_local": {
            "description": "Whether the app runs on this computer.",
            "title": "Is Local",
            "type": "boolean"
          },
          "recognised": {
            "description": "Whether the app is recognised by a host its maker controls; an unrecognised app is shown as unverified.",
            "title": "Recognised",
            "type": "boolean"
          },
          "redirect_host": {
            "description": "Where the person returns after answering.",
            "title": "Redirect Host",
            "type": "string"
          },
          "workspaces": {
            "items": {
              "$ref": "#/components/schemas/AiAppWorkspaceChoiceSchema"
            },
            "title": "Workspaces",
            "type": "array"
          }
        },
        "required": [
          "app_name",
          "brand",
          "recognised",
          "is_local",
          "redirect_host",
          "workspaces"
        ],
        "title": "AiAppRequestReadSchema",
        "type": "object"
      },
      "AiAppWorkspaceChoiceSchema": {
        "description": "A workspace the person may connect the app to.",
        "properties": {
          "can_write": {
            "description": "Whether an AI app may make changes in this workspace (a paid plan).",
            "title": "Can Write",
            "type": "boolean"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "workspace_id": {
            "title": "Workspace Id",
            "type": "string"
          }
        },
        "required": [
          "workspace_id",
          "name",
          "can_write"
        ],
        "title": "AiAppWorkspaceChoiceSchema",
        "type": "object"
      },
      "AiConfidence": {
        "description": "How sure the model is. Shown on the card; no band sends without a person.",
        "enum": [
          "high",
          "medium",
          "low"
        ],
        "title": "AiConfidence",
        "type": "string"
      },
      "AiContextChoiceSchema": {
        "description": "One option of a business-context choice field: the stored value and how it reads.",
        "properties": {
          "label": {
            "title": "Label",
            "type": "string"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value",
          "label"
        ],
        "title": "AiContextChoiceSchema",
        "type": "object"
      },
      "AiContextDocumentBulkCreateResponseSchema": {
        "description": "The documents a Drive link created, in the order the files were picked.",
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/AiContextDocumentReadSchema"
            },
            "title": "Data",
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "title": "AiContextDocumentBulkCreateResponseSchema",
        "type": "object"
      },
      "AiContextDocumentReadSchema": {
        "description": "One reference document: what it is, how far it got, and what prompts read.",
        "properties": {
          "content_type": {
            "title": "Content Type",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "drive_file_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Drive File Id"
          },
          "drive_web_view_link": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where to open the original in Google Drive, for linked documents.",
            "title": "Drive Web View Link"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the document could not be read, written for the reader.",
            "title": "Error"
          },
          "filename": {
            "title": "Filename",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "in_prompt_budget": {
            "default": true,
            "description": "Whether this document's summary actually fits the prompt budget alongside the documents before it. Computed on the list; a single read reports true.",
            "title": "In Prompt Budget",
            "type": "boolean"
          },
          "included_in_context": {
            "description": "Whether this document's summary joins the business context.",
            "title": "Included In Context",
            "type": "boolean"
          },
          "size_bytes": {
            "title": "Size Bytes",
            "type": "integer"
          },
          "source": {
            "$ref": "#/components/schemas/AiContextDocumentSource",
            "description": "Whether the file was uploaded or linked from Google Drive."
          },
          "status": {
            "$ref": "#/components/schemas/AiContextDocumentStatus",
            "description": "Poll the list while any document is still `processing`."
          },
          "steps": {
            "description": "What the last read did, one step per piece of work once it is done: the document read, the summary written. Grows while the document is `processing`; starts empty again when it is read again.",
            "items": {
              "$ref": "#/components/schemas/AiStep"
            },
            "maxItems": 40,
            "title": "Steps",
            "type": "array"
          },
          "summary": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The markdown summary that stands in for this document in AI prompts.",
            "title": "Summary"
          },
          "summary_edited": {
            "description": "True once somebody saved over the written summary by hand.",
            "title": "Summary Edited",
            "type": "boolean"
          },
          "summary_generated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Summary Generated At"
          },
          "title": {
            "title": "Title",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "source",
          "status",
          "error",
          "title",
          "filename",
          "content_type",
          "size_bytes",
          "summary",
          "summary_edited",
          "summary_generated_at",
          "included_in_context",
          "drive_file_id",
          "drive_web_view_link",
          "created_at",
          "updated_at"
        ],
        "title": "AiContextDocumentReadSchema",
        "type": "object"
      },
      "AiContextDocumentSource": {
        "description": "Where a reference document came from.",
        "enum": [
          "upload",
          "google_drive"
        ],
        "title": "AiContextDocumentSource",
        "type": "string"
      },
      "AiContextDocumentStatus": {
        "description": "How far a reference document has got through extraction and summarizing.\n\nUnlike a generation job, ``PENDING`` IS observed here: the row commits\nfirst and its workflow starts after that commit, so a reader can catch the\ngap. The two terminal states are absorbing.",
        "enum": [
          "pending",
          "processing",
          "ready",
          "failed"
        ],
        "title": "AiContextDocumentStatus",
        "type": "string"
      },
      "AiContextDocumentUpdateSchema": {
        "description": "Request body for editing one document (tri-state PATCH semantics).",
        "properties": {
          "included_in_context": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Whether this document's summary joins the business context.",
            "title": "Included In Context"
          },
          "summary": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New summary. Set to null to clear it. Saving one marks the summary as written by hand, so a later rewrite can warn before replacing it.",
            "title": "Summary"
          },
          "title": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "description": "New display name.",
            "title": "Title"
          }
        },
        "title": "AiContextDocumentUpdateSchema",
        "type": "object"
      },
      "AiContextDriveLinkRequestSchema": {
        "description": "Request body for linking files picked in the Google Picker.",
        "properties": {
          "file_ids": {
            "description": "Drive file ids from the Picker, in the order they were picked.",
            "items": {
              "maxLength": 255,
              "minLength": 1,
              "pattern": "^[A-Za-z0-9_-]+$",
              "type": "string"
            },
            "maxItems": 25,
            "minItems": 1,
            "title": "File Ids",
            "type": "array"
          }
        },
        "required": [
          "file_ids"
        ],
        "title": "AiContextDriveLinkRequestSchema",
        "type": "object"
      },
      "AiContextGenerateRequestSchema": {
        "description": "Request body for starting a run that writes the business context from a company domain.",
        "properties": {
          "domain": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A company domain like 'acme.com' (a full address or URL is read down to its domain); every field is written from it. Left out, the run reads the company domain in the signed-in user's email address and fills only the fields still empty when it lands.",
            "title": "Domain"
          }
        },
        "title": "AiContextGenerateRequestSchema",
        "type": "object"
      },
      "AiContextGenerationJobReadSchema": {
        "description": "A generation job's current state. Poll this until `status` is terminal.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "domain": {
            "description": "The domain this job is researching.",
            "title": "Domain",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why generation failed: infra trouble, or too little public content.",
            "title": "Error"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/AiContextGenerationStatus"
          },
          "steps": {
            "description": "What the research did, one step per piece of work once it is done: the documents and pages it read, the sections it wrote. Grows while the job runs; kept once it finishes.",
            "items": {
              "$ref": "#/components/schemas/AiStep"
            },
            "maxItems": 40,
            "title": "Steps",
            "type": "array"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "domain",
          "status",
          "error",
          "created_at",
          "updated_at"
        ],
        "title": "AiContextGenerationJobReadSchema",
        "type": "object"
      },
      "AiContextGenerationStatus": {
        "description": "Where a context-generation job has got to.\n\nJobs are born ``RUNNING``: creation validates, inserts and queues the\nworkflow in one call, so there is no separate committed-but-not-started\nphase. ``PENDING`` exists for schema parity with the other job enums and is\nnever observed. The two terminal states are absorbing: a job never leaves\nthem.",
        "enum": [
          "pending",
          "running",
          "succeeded",
          "failed"
        ],
        "title": "AiContextGenerationStatus",
        "type": "string"
      },
      "AiContextQaCreateSchema": {
        "description": "Request body for adding an answer to the Q&A.",
        "properties": {
          "answer": {
            "description": "The answer the agents should state.",
            "maxLength": 2000,
            "minLength": 1,
            "title": "Answer",
            "type": "string"
          },
          "question": {
            "description": "The question as a reply would ask it. A question the Q&A already answers, whatever its case or closing punctuation, is the same question.",
            "maxLength": 300,
            "minLength": 1,
            "title": "Question",
            "type": "string"
          },
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Keep the answer for this one sequence's agent alone; null, the default, keeps it for every sequence.",
            "title": "Sequence Id"
          }
        },
        "required": [
          "question",
          "answer"
        ],
        "title": "AiContextQaCreateSchema",
        "type": "object"
      },
      "AiContextQaEntrySchema": {
        "description": "One question the workspace answered once, which every reply the agents write reads.",
        "properties": {
          "answer": {
            "description": "The answer the agents state when a reply asks it.",
            "title": "Answer",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who first wrote it, or null for an API key.",
            "title": "Created By User Id"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "in_prompt": {
            "default": true,
            "description": "Whether the agents read this answer: the newest answers that fit `max_qa_context_chars` (GET /ai-context/) in each prompt it reaches do. Computed on the list; a single entry reports true.",
            "title": "In Prompt",
            "type": "boolean"
          },
          "previous_answer": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The answer this one replaced, or null when it was never changed.",
            "title": "Previous Answer"
          },
          "question": {
            "description": "The question, as last worded.",
            "title": "Question",
            "type": "string"
          },
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The one sequence whose agent reads this answer, or null for every sequence. Where a sequence's own answer and the one for every sequence answer the same question, that sequence's agent reads its own.",
            "title": "Sequence Id"
          },
          "sequence_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The name of `sequence_id`'s sequence; null for every sequence, or when that sequence is gone.",
            "title": "Sequence Name"
          },
          "source_thread_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The inbox conversation whose question it answered, or null when it was written on the Q&A list or that conversation was deleted.",
            "title": "Source Thread Id"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "updated_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who wrote the answer as it stands, or null for an API key.",
            "title": "Updated By User Id"
          },
          "via": {
            "$ref": "#/components/schemas/QaVia",
            "description": "How the answer as it stands was written: `person` on the dashboard, `assistant` by the AI Assistant or an MCP client for a person, `api` by an API key."
          }
        },
        "required": [
          "id",
          "question",
          "answer",
          "previous_answer",
          "created_by_user_id",
          "created_at",
          "updated_by_user_id",
          "updated_at",
          "via",
          "source_thread_id",
          "sequence_id"
        ],
        "title": "AiContextQaEntrySchema",
        "type": "object"
      },
      "AiContextQaUpdateSchema": {
        "description": "Request body for editing one Q&A answer (tri-state PATCH semantics).",
        "properties": {
          "answer": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "description": "The answer as it should read now. The one it replaces is kept.",
            "title": "Answer"
          },
          "question": {
            "anyOf": [
              {
                "maxLength": 300,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "description": "The question as it should read now.",
            "title": "Question"
          },
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "Move the answer to this one sequence's agent alone, or with null to every sequence.",
            "title": "Sequence Id"
          }
        },
        "title": "AiContextQaUpdateSchema",
        "type": "object"
      },
      "AiContextReadSchema": {
        "description": "The org's business context, plus its latest generation job for resume.",
        "properties": {
          "company_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Description"
          },
          "company_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyType"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the company makes money. Descriptive context shown to the AI Assistant and MCP clients; no writer reads it yet."
          },
          "company_type_choices": {
            "description": "Every `company_type` value, in the order a picker lists them.",
            "items": {
              "$ref": "#/components/schemas/AiContextChoiceSchema"
            },
            "title": "Company Type Choices",
            "type": "array"
          },
          "company_type_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`company_type` as a page shows it.",
            "title": "Company Type Label"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "first_run_available": {
            "description": "Whether `POST /ai-context/runs/` with no domain would start a first run now: the signed-in user created the workspace with a company email address, no field has text, and no run has been made. Ask for that run only when this is true; otherwise it is refused (422, `domain_required`). Always false for an API key.",
            "title": "First Run Available",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "ideal_buyer_personas": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ideal Buyer Personas"
          },
          "ideal_customer_profile": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ideal Customer Profile"
          },
          "interest_signals": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Interest Signals"
          },
          "last_generated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Generated At"
          },
          "latest_generation_job": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AiContextGenerationJobReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The org's most recent generation job, if any. Lets a reloaded page resume polling a job that is still running."
          },
          "max_context_chars": {
            "description": "How many characters of included reference document summaries one prompt reads, oldest document first. Documents past that line report `in_prompt_budget: false`.",
            "title": "Max Context Chars",
            "type": "integer"
          },
          "max_documents": {
            "description": "How many reference documents this workspace may keep.",
            "title": "Max Documents",
            "type": "integer"
          },
          "max_qa_answer_chars": {
            "description": "The longest a Q&A answer may be.",
            "title": "Max Qa Answer Chars",
            "type": "integer"
          },
          "max_qa_context_chars": {
            "description": "How many characters of the Q&A one reply's prompt reads, the newest answers first. Answers past that line report `in_prompt: false` on GET /ai-context/qa/.",
            "title": "Max Qa Context Chars",
            "type": "integer"
          },
          "max_qa_entries": {
            "description": "How many questions this workspace's Q&A may hold.",
            "title": "Max Qa Entries",
            "type": "integer"
          },
          "max_qa_question_chars": {
            "description": "The longest a Q&A question may be.",
            "title": "Max Qa Question Chars",
            "type": "integer"
          },
          "sells_to": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SellsTo"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who buys from the company. Descriptive context shown to the AI Assistant and MCP clients; no writer reads it yet."
          },
          "sells_to_choices": {
            "description": "Every `sells_to` value, in the order a picker lists them.",
            "items": {
              "$ref": "#/components/schemas/AiContextChoiceSchema"
            },
            "title": "Sells To Choices",
            "type": "array"
          },
          "sells_to_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`sells_to` as a page shows it.",
            "title": "Sells To Label"
          },
          "social_proof": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Social Proof"
          },
          "source_domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The domain last used to generate these fields; null until a generation succeeds.",
            "title": "Source Domain"
          },
          "source_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The page the last generation's company description came from, one of the pages it read; null when it named none. Read-only.",
            "title": "Source Url"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "voice": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the company words things: spelling, formality, what it calls its product and its buyers, jargon it avoids. The outbound agent matches it in every message.",
            "title": "Voice"
          }
        },
        "required": [
          "id",
          "company_description",
          "ideal_customer_profile",
          "ideal_buyer_personas",
          "interest_signals",
          "social_proof",
          "voice",
          "company_type",
          "company_type_label",
          "sells_to",
          "sells_to_label",
          "company_type_choices",
          "sells_to_choices",
          "source_url",
          "source_domain",
          "last_generated_at",
          "latest_generation_job",
          "first_run_available",
          "max_documents",
          "max_context_chars",
          "max_qa_entries",
          "max_qa_context_chars",
          "max_qa_question_chars",
          "max_qa_answer_chars",
          "created_at",
          "updated_at"
        ],
        "title": "AiContextReadSchema",
        "type": "object"
      },
      "AiContextUpdateSchema": {
        "description": "Request body for editing the context fields (tri-state PATCH semantics).",
        "properties": {
          "company_description": {
            "anyOf": [
              {
                "maxLength": 10000,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New value. Set to null to clear.",
            "title": "Company Description"
          },
          "company_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyType"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "How the company makes money. Set to null to clear.",
            "title": "Company Type"
          },
          "ideal_buyer_personas": {
            "anyOf": [
              {
                "maxLength": 10000,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New value. Set to null to clear.",
            "title": "Ideal Buyer Personas"
          },
          "ideal_customer_profile": {
            "anyOf": [
              {
                "maxLength": 10000,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New value. Set to null to clear.",
            "title": "Ideal Customer Profile"
          },
          "interest_signals": {
            "anyOf": [
              {
                "maxLength": 10000,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New value. Set to null to clear.",
            "title": "Interest Signals"
          },
          "sells_to": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SellsTo"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "Who buys from the company. Set to null to clear.",
            "title": "Sells To"
          },
          "social_proof": {
            "anyOf": [
              {
                "maxLength": 10000,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New value. Set to null to clear.",
            "title": "Social Proof"
          },
          "voice": {
            "anyOf": [
              {
                "maxLength": 600,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The company voice: spelling, formality, what the company calls its product and its buyers, jargon it avoids, how technical it gets. Not length or punctuation. Set to null to clear.",
            "title": "Voice"
          }
        },
        "title": "AiContextUpdateSchema",
        "type": "object"
      },
      "AiDraftApprovalReadSchema": {
        "description": "The reply Approve and send sent, and whether its Needs work's learning was saved.",
        "properties": {
          "ask_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AskReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why an older release held this reply for a person when it would otherwise have sent it, for example `low_confidence`, `always_ask`, `unverified_sender`, `different_sender` or `daily_cap`. Every reply waits for a person now, so it is null on every reply written since, and on a reply a person asked for."
          },
          "body_text": {
            "title": "Body Text",
            "type": "string"
          },
          "channel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InboxChannel"
              },
              {
                "type": "null"
              }
            ],
            "description": "The channel the reply goes out on: the one the message it answers came in on, so a contact who answered a LinkedIn conversation by email is answered by email. Null on a reply written before this was recorded, which goes out on the conversation's own channel."
          },
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AiConfidence"
              },
              {
                "type": "null"
              }
            ]
          },
          "confidence_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Confidence Reason"
          },
          "confidence_score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model's 0-100 calibration, clamped into the categorical band. Null for drafts that predate the field. Presentation only: every decision reads the categorical confidence.",
            "title": "Confidence Score"
          },
          "generated_body_text": {
            "title": "Generated Body Text",
            "type": "string"
          },
          "hand_edited": {
            "default": false,
            "description": "True when a person changed the agent's words (`body_text` is not `generated_body_text`): Needs work is off on it, and the edit proposes a learning instead (`POST /agent-learnings/hand-edits/`).",
            "title": "Hand Edited",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "learning_subject_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a Needs work on this reply is filed under: list its events with `GET /agent-learnings/thumbs-downs/?subject_key=`. One key for every version of the reply (Write again, a Needs work's rewrite, its Undo), so the note a Needs work left on one version is found on the next. Null on a reply no sequence's agent wrote, which has no agent to save a learning for.",
            "title": "Learning Subject Key"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The mailbox an email reply is sent from: the one the email it answers came in to. Null on a LinkedIn reply, on one written before this was recorded, and once that mailbox is removed; each goes out from the conversation's own mailbox.",
            "title": "Mailbox Id"
          },
          "outbound_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's message this reply came from, when a sequence's agent wrote it. Ratings and the send are recorded against that message too. A rating saves no learning; a person's edit of the draft proposes one, which sending saves, and Needs work on the draft teaches too. Null only on a reply an older release wrote for a conversation outside any sequence.",
            "title": "Outbound Message Id"
          },
          "rating": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DraftRating"
              },
              {
                "type": "null"
              }
            ],
            "description": "The human verdict on this draft, when one was given."
          },
          "rewriting": {
            "default": false,
            "description": "True while a changed learning has the agent write this waiting reply again. Its words stay as they are, and can still be approved, edited or rejected, until the new words replace them; a reply a person approved, edited or sent meanwhile keeps the person's version. False on every other reply.",
            "title": "Rewriting",
            "type": "boolean"
          },
          "saved_learnings": {
            "description": "How many learnings the reply's Needs work proposed this approval saved: 1 or 0. A proposed learning whose list is full is left unsaved while the reply is sent all the same, so a reply that proposed one and answers 0 saved nothing. On a dry run, how many sending it would save.",
            "title": "Saved Learnings",
            "type": "integer"
          },
          "saved_learnings_for_all_sequences": {
            "description": "Of saved_learnings, how many apply to every sequence, not only their own.",
            "title": "Saved Learnings For All Sequences",
            "type": "integer"
          },
          "send_after": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When an older release would have sent a `scheduled` reply; nothing sends it now. Kept on a reply that release sent. Null on a reply that was never scheduled, and on one handed back to a person, edited or approved.",
            "title": "Send After"
          },
          "send_outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DraftSendOutcome"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the words a person sent stand to what the AI wrote, decided as they sent it. `as_written`: the AI's words, unchanged. `edited`: the person changed them and kept what they say. `replaced`: the person sent a reply of their own in its place. Null until a person sends it, on a reply an older release sent without one, and on one sent before this was recorded."
          },
          "sent_by_kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageSentByKind"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who sent the reply: `person` when someone approved it, `system` on a reply an older release sent without one. Null until it is sent."
          },
          "source": {
            "$ref": "#/components/schemas/AiDraftSource"
          },
          "status": {
            "$ref": "#/components/schemas/AiDraftStatus",
            "description": "Where this reply stands. `pending_approval`: waiting for a person to approve, edit or discard it. `scheduled`: a reply an older release scheduled, which nothing sends now; it waits for a person exactly as `pending_approval` does, and is approved, edited or discarded the same way. `sending`: it is leaving now and can no longer be changed. `send_unknown`: it was sent, but the mailbox has not confirmed it yet; it settles on its own as `sent` or `send_failed`. `send_failed`: it did not go; write a fresh reply. `sent`: it went out. `discarded`: a person rejected it or asked for a new version. `stale`: the contact wrote again before anyone answered it."
          },
          "steer_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Steer Text"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          },
          "thread_id": {
            "format": "uuid",
            "title": "Thread Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "thread_id",
          "status",
          "source",
          "steer_text",
          "subject",
          "body_text",
          "generated_body_text",
          "confidence",
          "confidence_reason",
          "saved_learnings",
          "saved_learnings_for_all_sequences"
        ],
        "title": "AiDraftApprovalReadSchema",
        "type": "object"
      },
      "AiDraftCreateSchema": {
        "properties": {
          "steer_text": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Steer Text"
          },
          "thread_id": {
            "description": "The conversation to write a reply in.",
            "format": "uuid",
            "title": "Thread Id",
            "type": "string"
          }
        },
        "required": [
          "thread_id"
        ],
        "title": "AiDraftCreateSchema",
        "type": "object"
      },
      "AiDraftReadSchema": {
        "properties": {
          "ask_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AskReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why an older release held this reply for a person when it would otherwise have sent it, for example `low_confidence`, `always_ask`, `unverified_sender`, `different_sender` or `daily_cap`. Every reply waits for a person now, so it is null on every reply written since, and on a reply a person asked for."
          },
          "body_text": {
            "title": "Body Text",
            "type": "string"
          },
          "channel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InboxChannel"
              },
              {
                "type": "null"
              }
            ],
            "description": "The channel the reply goes out on: the one the message it answers came in on, so a contact who answered a LinkedIn conversation by email is answered by email. Null on a reply written before this was recorded, which goes out on the conversation's own channel."
          },
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AiConfidence"
              },
              {
                "type": "null"
              }
            ]
          },
          "confidence_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Confidence Reason"
          },
          "confidence_score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model's 0-100 calibration, clamped into the categorical band. Null for drafts that predate the field. Presentation only: every decision reads the categorical confidence.",
            "title": "Confidence Score"
          },
          "generated_body_text": {
            "title": "Generated Body Text",
            "type": "string"
          },
          "hand_edited": {
            "default": false,
            "description": "True when a person changed the agent's words (`body_text` is not `generated_body_text`): Needs work is off on it, and the edit proposes a learning instead (`POST /agent-learnings/hand-edits/`).",
            "title": "Hand Edited",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "learning_subject_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a Needs work on this reply is filed under: list its events with `GET /agent-learnings/thumbs-downs/?subject_key=`. One key for every version of the reply (Write again, a Needs work's rewrite, its Undo), so the note a Needs work left on one version is found on the next. Null on a reply no sequence's agent wrote, which has no agent to save a learning for.",
            "title": "Learning Subject Key"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The mailbox an email reply is sent from: the one the email it answers came in to. Null on a LinkedIn reply, on one written before this was recorded, and once that mailbox is removed; each goes out from the conversation's own mailbox.",
            "title": "Mailbox Id"
          },
          "outbound_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's message this reply came from, when a sequence's agent wrote it. Ratings and the send are recorded against that message too. A rating saves no learning; a person's edit of the draft proposes one, which sending saves, and Needs work on the draft teaches too. Null only on a reply an older release wrote for a conversation outside any sequence.",
            "title": "Outbound Message Id"
          },
          "rating": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DraftRating"
              },
              {
                "type": "null"
              }
            ],
            "description": "The human verdict on this draft, when one was given."
          },
          "rewriting": {
            "default": false,
            "description": "True while a changed learning has the agent write this waiting reply again. Its words stay as they are, and can still be approved, edited or rejected, until the new words replace them; a reply a person approved, edited or sent meanwhile keeps the person's version. False on every other reply.",
            "title": "Rewriting",
            "type": "boolean"
          },
          "send_after": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When an older release would have sent a `scheduled` reply; nothing sends it now. Kept on a reply that release sent. Null on a reply that was never scheduled, and on one handed back to a person, edited or approved.",
            "title": "Send After"
          },
          "send_outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DraftSendOutcome"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the words a person sent stand to what the AI wrote, decided as they sent it. `as_written`: the AI's words, unchanged. `edited`: the person changed them and kept what they say. `replaced`: the person sent a reply of their own in its place. Null until a person sends it, on a reply an older release sent without one, and on one sent before this was recorded."
          },
          "sent_by_kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageSentByKind"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who sent the reply: `person` when someone approved it, `system` on a reply an older release sent without one. Null until it is sent."
          },
          "source": {
            "$ref": "#/components/schemas/AiDraftSource"
          },
          "status": {
            "$ref": "#/components/schemas/AiDraftStatus",
            "description": "Where this reply stands. `pending_approval`: waiting for a person to approve, edit or discard it. `scheduled`: a reply an older release scheduled, which nothing sends now; it waits for a person exactly as `pending_approval` does, and is approved, edited or discarded the same way. `sending`: it is leaving now and can no longer be changed. `send_unknown`: it was sent, but the mailbox has not confirmed it yet; it settles on its own as `sent` or `send_failed`. `send_failed`: it did not go; write a fresh reply. `sent`: it went out. `discarded`: a person rejected it or asked for a new version. `stale`: the contact wrote again before anyone answered it."
          },
          "steer_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Steer Text"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          },
          "thread_id": {
            "format": "uuid",
            "title": "Thread Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "thread_id",
          "status",
          "source",
          "steer_text",
          "subject",
          "body_text",
          "generated_body_text",
          "confidence",
          "confidence_reason"
        ],
        "title": "AiDraftReadSchema",
        "type": "object"
      },
      "AiDraftSource": {
        "enum": [
          "auto_drafted",
          "on_demand"
        ],
        "title": "AiDraftSource",
        "type": "string"
      },
      "AiDraftStatus": {
        "description": "Where one drafted reply stands.\n\nSTALE is its own terminal state rather than a flavour of DISCARDED: \"the\nprospect wrote again before anyone answered\" and \"a human said no\" are\ndifferent facts, and only the second one says anything about draft quality.\n\nThe send states past SCHEDULED exist for the same reason SEND_UNKNOWN does:\nonce a draft can leave without a person watching, \"we do not know\" has to be\na state of its own. Collapsing it into SEND_FAILED would have a retry send\nthe same reply twice; collapsing it into SENT would lose a reply silently.",
        "enum": [
          "pending_approval",
          "sent",
          "discarded",
          "stale",
          "scheduled",
          "sending",
          "send_unknown",
          "send_failed"
        ],
        "title": "AiDraftStatus",
        "type": "string"
      },
      "AiStep": {
        "additionalProperties": false,
        "description": "One thing an AI turn did, as the wire spells it.\n\nField-for-field identical to ``table_live_updates.TableCellActivityStepSchema``\nON PURPOSE, and the duplication is the design. That schema sits in the table\nstratum's kernel, which the lead search, inbox and sequence surfaces have no\nbusiness importing; this one sits under every surface equally. Because the\ntwo agree exactly, the frontend's ``TimelineStep`` renders both with no\nconversion and no second component, which is the property worth protecting.\n``test_ai_step_mirrors_the_cell_activity_step`` pins them together.\n\nPlain strings rather than enums, for the same reason the cell schema uses\nthem: the vocabulary is open, clients must tolerate tokens they have not\nlearned yet, and a new action should never be able to break a running\ndashboard.",
        "properties": {
          "action": {
            "description": "What kind of move this was, e.g. `read_table`, `plan`, `write_column`.",
            "title": "Action",
            "type": "string"
          },
          "detail": {
            "default": "",
            "description": "The step's input: the instruction, the column it read, the query it ran.",
            "title": "Detail",
            "type": "string"
          },
          "duration_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Wall clock for the work this step describes, never an estimate.",
            "title": "Duration Ms"
          },
          "observation": {
            "default": "",
            "description": "One line on what came back. The half that makes a step worth reading.",
            "maxLength": 500,
            "title": "Observation",
            "type": "string"
          },
          "outcome": {
            "default": "completed",
            "description": "`completed`, `failed`, `refused` or `stopped`. Clients must tolerate new tokens.",
            "title": "Outcome",
            "type": "string"
          },
          "thought": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model's stated reasoning for choosing this step. Set by the agent loop; the assistant surfaces leave it null, and the renderer simply omits the rung.",
            "title": "Thought"
          }
        },
        "required": [
          "action"
        ],
        "title": "AiStep",
        "type": "object"
      },
      "AnalyticsPointReadSchema": {
        "properties": {
          "connection_requests": {
            "default": 0,
            "title": "Connection Requests",
            "type": "integer"
          },
          "day": {
            "format": "date-time",
            "title": "Day",
            "type": "string"
          },
          "linkedin_actions": {
            "default": 0,
            "title": "Linkedin Actions",
            "type": "integer"
          },
          "linkedin_messages": {
            "default": 0,
            "title": "Linkedin Messages",
            "type": "integer"
          },
          "replied": {
            "title": "Replied",
            "type": "integer"
          },
          "sent": {
            "title": "Sent",
            "type": "integer"
          }
        },
        "required": [
          "day",
          "sent",
          "replied"
        ],
        "title": "AnalyticsPointReadSchema",
        "type": "object"
      },
      "AnswerQuestionsSchema": {
        "description": "The answers to every question on a reply's card.",
        "properties": {
          "also_answer_waiting": {
            "default": false,
            "description": "Also have the agent answer the other conversations of the sequence waiting on the same questions (the card's `others_waiting`), from the answers saved to the Q&A here and the Q&A's own. Each is a reply of its own, charged as any the agent writes and left for approval, written in the background.",
            "title": "Also Answer Waiting",
            "type": "boolean"
          },
          "answers": {
            "description": "One answer per question the card asks, each naming its question.",
            "items": {
              "$ref": "#/components/schemas/QuestionAnswerSchema"
            },
            "maxItems": 5,
            "minItems": 1,
            "title": "Answers",
            "type": "array"
          },
          "message_id": {
            "description": "The reply the card is on, its `question_card.message_id`.",
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          }
        },
        "required": [
          "message_id",
          "answers"
        ],
        "title": "AnswerQuestionsSchema",
        "type": "object"
      },
      "AnswerScope": {
        "description": "Where a person's answer to one of the agent's questions is kept (G3, 2026-10-19).\n\nThe scope switch learnings have (2026-10-26). ``SEQUENCE``, the card's choice unless\na person picks another: in the Q&A for the reply's sequence, which every later reply\nits agent writes reads. ``ACCOUNT``: in the Q&A for every sequence. ``THIS_REPLY``:\nfor this conversation alone, kept on the reply's assessment so every later writing of\nit, and every later reply of the conversation, has it (review C1, 2026-10-27); a saved\nanswer that names the contact, or that the Q&A will not take, is kept so too.",
        "enum": [
          "sequence",
          "account",
          "this_reply"
        ],
        "title": "AnswerScope",
        "type": "string"
      },
      "AnsweredQuestionsDraftReadSchema": {
        "description": "The reply written from a card's answers, and which answers stayed with it alone.",
        "properties": {
          "ask_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AskReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why an older release held this reply for a person when it would otherwise have sent it, for example `low_confidence`, `always_ask`, `unverified_sender`, `different_sender` or `daily_cap`. Every reply waits for a person now, so it is null on every reply written since, and on a reply a person asked for."
          },
          "body_text": {
            "title": "Body Text",
            "type": "string"
          },
          "channel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InboxChannel"
              },
              {
                "type": "null"
              }
            ],
            "description": "The channel the reply goes out on: the one the message it answers came in on, so a contact who answered a LinkedIn conversation by email is answered by email. Null on a reply written before this was recorded, which goes out on the conversation's own channel."
          },
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AiConfidence"
              },
              {
                "type": "null"
              }
            ]
          },
          "confidence_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Confidence Reason"
          },
          "confidence_score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model's 0-100 calibration, clamped into the categorical band. Null for drafts that predate the field. Presentation only: every decision reads the categorical confidence.",
            "title": "Confidence Score"
          },
          "generated_body_text": {
            "title": "Generated Body Text",
            "type": "string"
          },
          "hand_edited": {
            "default": false,
            "description": "True when a person changed the agent's words (`body_text` is not `generated_body_text`): Needs work is off on it, and the edit proposes a learning instead (`POST /agent-learnings/hand-edits/`).",
            "title": "Hand Edited",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kept_for_this_conversation": {
            "description": "The question ids whose answers were to be saved to the Q&A but are kept for this conversation alone, so no other reply reads them. `not_saved` says why.",
            "items": {
              "type": "string"
            },
            "title": "Kept For This Conversation",
            "type": "array"
          },
          "learning_subject_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a Needs work on this reply is filed under: list its events with `GET /agent-learnings/thumbs-downs/?subject_key=`. One key for every version of the reply (Write again, a Needs work's rewrite, its Undo), so the note a Needs work left on one version is found on the next. Null on a reply no sequence's agent wrote, which has no agent to save a learning for.",
            "title": "Learning Subject Key"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The mailbox an email reply is sent from: the one the email it answers came in to. Null on a LinkedIn reply, on one written before this was recorded, and once that mailbox is removed; each goes out from the conversation's own mailbox.",
            "title": "Mailbox Id"
          },
          "not_saved": {
            "description": "Each answer in `kept_for_this_conversation`, with why it was not saved.",
            "items": {
              "$ref": "#/components/schemas/KeptAnswerReadSchema"
            },
            "title": "Not Saved",
            "type": "array"
          },
          "outbound_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's message this reply came from, when a sequence's agent wrote it. Ratings and the send are recorded against that message too. A rating saves no learning; a person's edit of the draft proposes one, which sending saves, and Needs work on the draft teaches too. Null only on a reply an older release wrote for a conversation outside any sequence.",
            "title": "Outbound Message Id"
          },
          "rating": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DraftRating"
              },
              {
                "type": "null"
              }
            ],
            "description": "The human verdict on this draft, when one was given."
          },
          "rewriting": {
            "default": false,
            "description": "True while a changed learning has the agent write this waiting reply again. Its words stay as they are, and can still be approved, edited or rejected, until the new words replace them; a reply a person approved, edited or sent meanwhile keeps the person's version. False on every other reply.",
            "title": "Rewriting",
            "type": "boolean"
          },
          "send_after": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When an older release would have sent a `scheduled` reply; nothing sends it now. Kept on a reply that release sent. Null on a reply that was never scheduled, and on one handed back to a person, edited or approved.",
            "title": "Send After"
          },
          "send_outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DraftSendOutcome"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the words a person sent stand to what the AI wrote, decided as they sent it. `as_written`: the AI's words, unchanged. `edited`: the person changed them and kept what they say. `replaced`: the person sent a reply of their own in its place. Null until a person sends it, on a reply an older release sent without one, and on one sent before this was recorded."
          },
          "sent_by_kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageSentByKind"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who sent the reply: `person` when someone approved it, `system` on a reply an older release sent without one. Null until it is sent."
          },
          "source": {
            "$ref": "#/components/schemas/AiDraftSource"
          },
          "status": {
            "$ref": "#/components/schemas/AiDraftStatus",
            "description": "Where this reply stands. `pending_approval`: waiting for a person to approve, edit or discard it. `scheduled`: a reply an older release scheduled, which nothing sends now; it waits for a person exactly as `pending_approval` does, and is approved, edited or discarded the same way. `sending`: it is leaving now and can no longer be changed. `send_unknown`: it was sent, but the mailbox has not confirmed it yet; it settles on its own as `sent` or `send_failed`. `send_failed`: it did not go; write a fresh reply. `sent`: it went out. `discarded`: a person rejected it or asked for a new version. `stale`: the contact wrote again before anyone answered it."
          },
          "steer_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Steer Text"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          },
          "thread_id": {
            "format": "uuid",
            "title": "Thread Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "thread_id",
          "status",
          "source",
          "steer_text",
          "subject",
          "body_text",
          "generated_body_text",
          "confidence",
          "confidence_reason",
          "kept_for_this_conversation",
          "not_saved"
        ],
        "title": "AnsweredQuestionsDraftReadSchema",
        "type": "object"
      },
      "AppListingCallbackRequestSchema": {
        "description": "The OAuth callback parameters posted by the frontend callback page.",
        "properties": {
          "code": {
            "maxLength": 2048,
            "minLength": 1,
            "title": "Code",
            "type": "string"
          },
          "params": {
            "additionalProperties": {
              "maxLength": 2048,
              "type": "string"
            },
            "description": "Extra provider callback query parameters forwarded by the callback page, used to auto-detect the data center where the vendor returns it (e.g. Zoho `location`).",
            "propertyNames": {
              "maxLength": 255,
              "minLength": 1
            },
            "title": "Params",
            "type": "object"
          },
          "state": {
            "maxLength": 512,
            "minLength": 1,
            "title": "State",
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "title": "AppListingCallbackRequestSchema",
        "type": "object"
      },
      "AppListingCallbackResponseSchema": {
        "description": "A pending-connection id.\n\nThe user finalizes it by calling the create endpoint (``POST /integrations/{type}/``) with this\n``connection_id``. The OAuth-connect flow shares the regular create/preview endpoints.",
        "properties": {
          "connection_id": {
            "title": "Connection Id",
            "type": "string"
          }
        },
        "required": [
          "connection_id"
        ],
        "title": "AppListingCallbackResponseSchema",
        "type": "object"
      },
      "AppListingClaimOntoExistingResponseSchema": {
        "description": "The integration a switch/reconnect re-authorized in place.",
        "properties": {
          "integration_id": {
            "description": "The existing integration, now re-authorized (same id, now one-click).",
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          }
        },
        "required": [
          "integration_id"
        ],
        "title": "AppListingClaimOntoExistingResponseSchema",
        "type": "object"
      },
      "AppListingConnectionConfigResponseSchema": {
        "description": "The engine-captured connect-time config for a pending connection.",
        "properties": {
          "config": {
            "additionalProperties": {
              "maxLength": 2048,
              "type": "string"
            },
            "description": "The tenant/region/login config the engine captured at connect time (e.g. Salesforce `login_url`), for the create wizard to show read-only. Empty for one-click listings.",
            "title": "Config",
            "type": "object"
          }
        },
        "title": "AppListingConnectionConfigResponseSchema",
        "type": "object"
      },
      "AppListingInstallRequestSchema": {
        "description": "Request to begin an app listing OAuth install.",
        "properties": {
          "inputs": {
            "additionalProperties": {
              "maxLength": 2048,
              "minLength": 1,
              "type": "string"
            },
            "description": "Connect-time inputs collected before the redirect (tenant address, region, or a choice), keyed by input name. Empty for listings that need no inputs.",
            "propertyNames": {
              "maxLength": 255,
              "minLength": 1
            },
            "title": "Inputs",
            "type": "object"
          },
          "integration_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For switch/reconnect only: the existing integration to re-authorize in place. Bound into the OAuth state so the claim mutates only this integration. Omit for new connects.",
            "title": "Integration Id"
          },
          "intent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SwitchIntent"
              },
              {
                "type": "null"
              }
            ],
            "description": "For switch/reconnect only: 'switch' (API-key -> one-click) or 'reconnect' (re-authorize). Must be set together with integration_id."
          }
        },
        "title": "AppListingInstallRequestSchema",
        "type": "object"
      },
      "AppListingInstallResponseSchema": {
        "description": "The provider authorize URL to redirect the user to.",
        "properties": {
          "authorize_url": {
            "title": "Authorize Url",
            "type": "string"
          }
        },
        "required": [
          "authorize_url"
        ],
        "title": "AppListingInstallResponseSchema",
        "type": "object"
      },
      "AppListingPreflightRequestSchema": {
        "description": "Request to check whether a customer's hand-typed workspace resolves before the redirect.",
        "properties": {
          "inputs": {
            "additionalProperties": {
              "maxLength": 2048,
              "minLength": 1,
              "type": "string"
            },
            "description": "Connect-time inputs to resolve-check, keyed by input name.",
            "propertyNames": {
              "maxLength": 255,
              "minLength": 1
            },
            "title": "Inputs",
            "type": "object"
          }
        },
        "title": "AppListingPreflightRequestSchema",
        "type": "object"
      },
      "AppListingPreflightResponseSchema": {
        "description": "The pre-flight resolve-check outcome.",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/PreflightStatus",
            "description": "found (safe to redirect), not_found (keep the customer on the form), or unreachable (the customer may proceed with a soft warning)."
          }
        },
        "required": [
          "status"
        ],
        "title": "AppListingPreflightResponseSchema",
        "type": "object"
      },
      "ApprovalLevel": {
        "description": "Which level an effective mode came from, so the UI can say \"inherited from\" what.\n\n``DEFAULT`` is the product's own answer for a sender that has never been\nset: manual for LinkedIn, automatic for email. There is no workspace\nlevel: a sender that had one would be governed by two settings pages at\nonce, and the one a rep actually looks at is the sender's.",
        "enum": [
          "default",
          "sender",
          "sequence"
        ],
        "title": "ApprovalLevel",
        "type": "string"
      },
      "ApprovalMode": {
        "description": "Whether a channel's steps wait for a person or run on their own.\n\nThe values mirror the sender's own settings exactly (``mailbox``'s\n``LinkedInApprovalMode`` and ``EmailApprovalMode``): a sender's setting IS\nits sender-level override, and the strings cross over without a\ntranslation table between them.",
        "enum": [
          "manual",
          "auto"
        ],
        "title": "ApprovalMode",
        "type": "string"
      },
      "ApprovalScope": {
        "enum": [
          "once",
          "thread",
          "project_me",
          "project_all"
        ],
        "type": "string"
      },
      "ApproveDraftSchema": {
        "description": "What the person's composer shows under the draft's words, and how they approve it.",
        "properties": {
          "as_written_only": {
            "default": false,
            "description": "Send it only in the words the AI wrote, spacing aside: the Inbox's Approve and send over many conversations sets it, so a reply somebody edited is refused with 409 and keeps waiting, to be read and sent from its conversation.",
            "title": "As Written Only",
            "type": "boolean"
          },
          "rev": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The reply's feedback session `rev` as read. When sent, a session a note or an edit changed since is refused (409) and the reply keeps waiting; left out, sending saves the session as it stands.",
            "title": "Rev"
          },
          "signature_block": {
            "anyOf": [
              {
                "maxLength": 4000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The divider and signature exactly as the composer shows them under the draft's words, empty when the person removed them. Sent under the words in place of the mailbox's own signature, so the email is what they saw. Null signs as the mailbox does.",
            "title": "Signature Block"
          }
        },
        "title": "ApproveDraftSchema",
        "type": "object"
      },
      "ArchivedScope": {
        "description": "Which tables a listing reaches, as far as the archive goes.",
        "enum": [
          "exclude",
          "include",
          "only"
        ],
        "title": "ArchivedScope",
        "type": "string"
      },
      "AskReason": {
        "description": "Why a message that could have sent unattended was put in front of a person.\n\nOne vocabulary for every gate between an agent writing a message and the\nmessage leaving: what the agent itself said about the draft\n(``LOW_CONFIDENCE``, ``FINDINGS``, ``INSUFFICIENT_DATA``, ``POLICY``), what\nthe sender or the cadence asked for (``ALWAYS_ASK``, ``SEQUENCE_MANUAL``,\n``STEP_REQUIRES_APPROVAL``), what the pacing rules refused\n(``DAILY_CAP``, ``CONSECUTIVE_CAP``, ``THREAD_CAP``, ``HOURLY_CAP``,\n``ORG_DAILY_CAP``), what the mailbox or the thread made unsafe\n(``UNVERIFIED_SENDER``, ``DIFFERENT_SENDER``, ``LABEL``, ``QUESTION``,\n``STALE_INBOUND``, ``SEQUENCE_GONE``), and what the counterparty turned out to be\n(``BOT_QUESTION``, ``AUTOMATED_COUNTERPARTY``, ``AUTHENTICATION``,\n``LANGUAGE``, ``LINKEDIN_ONLY``). ``KILL_SWITCH`` is the platform switch\nthat stops unattended sending outright, and ``SEND_INTERRUPTED`` an\nunattended reply whose send never got as far as a provider.\n``SENDER_SWITCHED_TO_MANUAL`` is a LinkedIn step queued unasked that went\nback to a person because its sender switched to manual before it ran.\n\nStored on the task so the queue can say why each row is there, and so\n\"why did nothing send\" is answerable by counting rows rather than by\nreading logs.",
        "enum": [
          "low_confidence",
          "findings",
          "insufficient_data",
          "policy",
          "always_ask",
          "sequence_manual",
          "step_requires_approval",
          "daily_cap",
          "unverified_sender",
          "suppressed",
          "different_sender",
          "label",
          "question",
          "consecutive_cap",
          "thread_cap",
          "hourly_cap",
          "org_daily_cap",
          "stale_inbound",
          "sequence_gone",
          "bot_question",
          "automated_counterparty",
          "kill_switch",
          "authentication",
          "language",
          "linkedin_only",
          "send_interrupted",
          "sender_switched_to_manual"
        ],
        "title": "AskReason",
        "type": "string"
      },
      "AssignedSenderSendModeReadSchema": {
        "description": "One sender assigned to a sequence, and how much of their email sends without a person.",
        "properties": {
          "email_send_mode": {
            "$ref": "#/components/schemas/SenderSendMode",
            "description": "This sender's own send mode, tightened to `always_ask` when the sequence asks for approval. It decides the agent's replies from their mailboxes in this sequence's conversations. The sequence's own emails run under `cadence_email_send_mode` whichever assigned sender's mailbox they leave from, so they can be held where this mode alone would send. `always_send` sends every email; `send_when_confident` sends an agent-written email when the agent rated its own message high and had enough data, and holds back the rest; `always_ask` has a person approve every email."
          },
          "sender_profile_id": {
            "format": "uuid",
            "title": "Sender Profile Id",
            "type": "string"
          },
          "sender_profile_name": {
            "description": "The sender as the Senders page names them.",
            "title": "Sender Profile Name",
            "type": "string"
          }
        },
        "required": [
          "sender_profile_id",
          "sender_profile_name",
          "email_send_mode"
        ],
        "title": "AssignedSenderSendModeReadSchema",
        "type": "object"
      },
      "AssistantAppliedContextSchema": {
        "description": "Context for a change the AI Assistant made through a granted workspace action.",
        "properties": {
          "column_display_name": {
            "default": "",
            "title": "Column Display Name",
            "type": "string"
          },
          "proposal_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Proposal Id"
          },
          "summary": {
            "default": "",
            "title": "Summary",
            "type": "string"
          },
          "type": {
            "const": "assistant_applied",
            "default": "assistant_applied",
            "title": "Type",
            "type": "string"
          },
          "verb": {
            "default": "",
            "title": "Verb",
            "type": "string"
          }
        },
        "title": "AssistantAppliedContextSchema",
        "type": "object"
      },
      "AssistantErrorReason": {
        "description": "Why a turn could not run, for a client choosing what to show instead.\n\nEvery reason an ``error`` frame of the table assistant, the agent builder\nor the campaign drafter can carry lives here, so that a route builds the\nframe from the enum rather than spelling the wire value out: a value the\nenum names but no route sends is a promise to the client that nothing\nkeeps, and a value a route sends but the enum lacks is one the generated\nclient cannot narrow on.",
        "enum": [
          "limit",
          "paused",
          "stopped",
          "not_found",
          "locked",
          "ai_unavailable"
        ],
        "title": "AssistantErrorReason",
        "type": "string"
      },
      "AssistantPromptCreateSchema": {
        "description": "Save one prompt for this workspace to use again.",
        "properties": {
          "body": {
            "description": "The message the card will put in the composer.",
            "maxLength": 2000,
            "minLength": 1,
            "title": "Body",
            "type": "string"
          },
          "title": {
            "anyOf": [
              {
                "maxLength": 60,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What to call the card. Left out, a name is taken from the prompt's own first sentence, which is what saving a message you already sent does.",
            "title": "Title"
          }
        },
        "required": [
          "body"
        ],
        "title": "AssistantPromptCreateSchema",
        "type": "object"
      },
      "AssistantPromptReadSchema": {
        "description": "One prompt offered under the assistant's composer.",
        "properties": {
          "body": {
            "description": "The message pressing the card puts in the composer.",
            "title": "Body",
            "type": "string"
          },
          "built_in": {
            "description": "Whether we wrote it. A built-in cannot be edited or deleted.",
            "title": "Built In",
            "type": "boolean"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Null for a built-in prompt, which is defined in our code rather than saved.",
            "title": "Id"
          },
          "key": {
            "description": "Stable identifier for this card across both kinds: the built-in's key, or the saved prompt's id.",
            "title": "Key",
            "type": "string"
          },
          "title": {
            "description": "What the card is called.",
            "title": "Title",
            "type": "string"
          },
          "updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Updated At"
          }
        },
        "required": [
          "key",
          "title",
          "body",
          "built_in"
        ],
        "title": "AssistantPromptReadSchema",
        "type": "object"
      },
      "AssistantPromptUpdateSchema": {
        "description": "Rewrite one of this workspace's own prompts.",
        "properties": {
          "body": {
            "description": "The message pressing the card puts in the composer.",
            "maxLength": 2000,
            "minLength": 1,
            "title": "Body",
            "type": "string"
          },
          "title": {
            "description": "What the card is called.",
            "maxLength": 60,
            "minLength": 1,
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "title",
          "body"
        ],
        "title": "AssistantPromptUpdateSchema",
        "type": "object"
      },
      "AssistantSettingsReadSchema": {
        "description": "What the assistant may apply unasked in this workspace.",
        "properties": {
          "approval_threshold_credits": {
            "description": "Whole credits. Anything priced at or above this always proposes, whatever was granted.",
            "title": "Approval Threshold Credits",
            "type": "integer"
          },
          "default_granted_tools": {
            "description": "The write operations the assistant may call without asking, for everybody in this workspace. Operation names, as `GET /assistant/tools/` lists them.",
            "items": {
              "type": "string"
            },
            "title": "Default Granted Tools",
            "type": "array"
          },
          "default_granted_verbs": {
            "description": "The verbs a new conversation may apply without asking.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceVerb"
            },
            "title": "Default Granted Verbs",
            "type": "array"
          }
        },
        "required": [
          "approval_threshold_credits",
          "default_granted_verbs",
          "default_granted_tools"
        ],
        "title": "AssistantSettingsReadSchema",
        "type": "object"
      },
      "AssistantSettingsUpdateSchema": {
        "description": "Change the threshold, the default grants, or both; a field left out keeps its value.",
        "properties": {
          "approval_threshold_credits": {
            "anyOf": [
              {
                "maximum": 100000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Approval Threshold Credits"
          },
          "default_granted_tools": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "maxItems": 200,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The write operations everybody in this workspace may have the assistant call without asking. Send the current list minus one to take it back.",
            "title": "Default Granted Tools"
          },
          "default_granted_verbs": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/WorkspaceVerb"
                },
                "maxItems": 8,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Granted Verbs"
          }
        },
        "title": "AssistantSettingsUpdateSchema",
        "type": "object"
      },
      "AssistantStreamErrorSchema": {
        "description": "The data of a reasoned SSE ``error`` frame, and the ``detail`` of a 429.\n\n``reason`` says why the turn did not run: ``limit`` (the workspace's daily\nallowance is spent) or ``paused`` (every AI Assistant is switched off) on\nevery surface; ``stopped`` when a stateless generation was stopped by the\ncaller; ``not_found`` and ``locked`` when the campaign drafter's stream\nreports what its plain route answers 404 and 423 to; ``ai_unavailable``\nwhen the model behind the agent cannot be asked at all. A 429 only ever\ncarries the first two. Shared by every assistant surface that spends the\nallowance, so one client component can read every refusal the same way.",
        "properties": {
          "detail": {
            "title": "Detail",
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/AssistantErrorReason"
          }
        },
        "required": [
          "detail",
          "reason"
        ],
        "title": "AssistantStreamErrorSchema",
        "type": "object"
      },
      "AssistantThreadLinkResponseSchema": {
        "description": "The link as recorded, both ends.",
        "properties": {
          "continued_from": {
            "$ref": "#/components/schemas/AssistantThreadRefSchema"
          },
          "continued_in": {
            "$ref": "#/components/schemas/AssistantThreadRefSchema"
          }
        },
        "required": [
          "continued_from",
          "continued_in"
        ],
        "title": "AssistantThreadLinkResponseSchema",
        "type": "object"
      },
      "AssistantThreadLinkSchema": {
        "description": "Record that this thread continues in another: a search, and the table it produced.",
        "properties": {
          "continued_in": {
            "$ref": "#/components/schemas/AssistantThreadRefSchema"
          }
        },
        "required": [
          "continued_in"
        ],
        "title": "AssistantThreadLinkSchema",
        "type": "object"
      },
      "AssistantThreadReadSchema": {
        "description": "One thread in the list, from whichever assistant it belongs to.",
        "properties": {
          "continued_from": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AssistantThreadRefSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The thread this one continues: the search that produced this table."
          },
          "continued_in": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AssistantThreadRefSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The thread this one continues in: the table this search produced."
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "last_message_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Message At"
          },
          "open_path": {
            "description": "Where the dashboard navigates to reopen the thread: its chat.",
            "title": "Open Path",
            "type": "string"
          },
          "origin": {
            "$ref": "#/components/schemas/ThreadOrigin"
          },
          "origin_ref_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table or saved agent the thread is bound to; null for a lead search or the general chat.",
            "title": "Origin Ref Id"
          },
          "origin_ref_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "That table's or agent's name, or what a lead search was for; null when the thread is bound to nothing, or its agent is gone.",
            "title": "Origin Ref Label"
          },
          "pinned": {
            "title": "Pinned",
            "type": "boolean"
          },
          "shared": {
            "description": "A legacy table thread nobody is recorded as starting, which the whole workspace sees and may rename, pin or delete.",
            "title": "Shared",
            "type": "boolean"
          },
          "thread_id": {
            "format": "uuid",
            "title": "Thread Id",
            "type": "string"
          },
          "title": {
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "origin",
          "thread_id",
          "title",
          "last_message_at",
          "created_at",
          "pinned",
          "shared",
          "origin_ref_id",
          "origin_ref_label",
          "continued_from",
          "continued_in",
          "open_path"
        ],
        "title": "AssistantThreadReadSchema",
        "type": "object"
      },
      "AssistantThreadRefSchema": {
        "description": "One thread, named by its store and its id in that store.",
        "properties": {
          "origin": {
            "$ref": "#/components/schemas/ThreadOrigin"
          },
          "thread_id": {
            "format": "uuid",
            "title": "Thread Id",
            "type": "string"
          }
        },
        "required": [
          "origin",
          "thread_id"
        ],
        "title": "AssistantThreadRefSchema",
        "type": "object"
      },
      "AssistantThreadUpdateSchema": {
        "description": "Rename a thread, pin or unpin it, or both. A field left out is left alone.",
        "properties": {
          "pinned": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True pins the thread to the top; false unpins.",
            "title": "Pinned"
          },
          "title": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The new title. Kept beside the store's own title rather than written into it, so the store keeps naming the thread after its first message and this is what the list shows instead.",
            "title": "Title"
          }
        },
        "title": "AssistantThreadUpdateSchema",
        "type": "object"
      },
      "AssistantUnavailableResponseSchema": {
        "description": "A refused turn: the sentence to show, and why.",
        "properties": {
          "detail": {
            "$ref": "#/components/schemas/AssistantStreamErrorSchema"
          }
        },
        "required": [
          "detail"
        ],
        "title": "AssistantUnavailableResponseSchema",
        "type": "object"
      },
      "AssistantUndoneContextSchema": {
        "description": "Context for the reversal of an assistant's change to the table.\n\nHistory only: undo was taken out of the assistant and nothing writes\nthis any more. It stays so trails written before that still read back.",
        "properties": {
          "proposal_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Proposal Id"
          },
          "summary": {
            "default": "",
            "title": "Summary",
            "type": "string"
          },
          "type": {
            "const": "assistant_undone",
            "default": "assistant_undone",
            "title": "Type",
            "type": "string"
          },
          "verb": {
            "default": "",
            "title": "Verb",
            "type": "string"
          }
        },
        "title": "AssistantUndoneContextSchema",
        "type": "object"
      },
      "AttachmentReadSchema": {
        "properties": {
          "content_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The file's Content-ID, without its angle brackets, or null when it has none. The message's HTML names an image shown inside it as cid:<content_id>, but mail clients set a Content-ID on ordinary attachments too, so one alone does not mean the file is shown inside the message: only the HTML naming it does.",
            "title": "Content Id"
          },
          "content_type": {
            "title": "Content Type",
            "type": "string"
          },
          "filename": {
            "title": "Filename",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "size_bytes": {
            "title": "Size Bytes",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "filename",
          "content_type",
          "size_bytes"
        ],
        "title": "AttachmentReadSchema",
        "type": "object"
      },
      "AudienceDiffReadSchema": {
        "description": "What an audience change does to who is in progress: pending, active, waiting or paused.",
        "properties": {
          "added": {
            "description": "Contacts in progress after the change who are not now: new contacts, contacts back where they left off, and when starting fresh everyone who starts at step one. When the counts are capped, the new contacts are only the rows read: at least this many.",
            "title": "Added",
            "type": "integer"
          },
          "not_changed": {
            "description": "Every other contact already in the sequence. Exact.",
            "title": "Not Changed",
            "type": "integer"
          },
          "pauses_sending": {
            "description": "Applying it pauses a running sequence first. A filter change never does.",
            "title": "Pauses Sending",
            "type": "boolean"
          },
          "removed": {
            "description": "Contacts in progress now who stop, reading Left the audience. Exact at any table size.",
            "title": "Removed",
            "type": "integer"
          }
        },
        "required": [
          "added",
          "removed",
          "not_changed",
          "pauses_sending"
        ],
        "title": "AudienceDiffReadSchema",
        "type": "object"
      },
      "AudienceEligibilityContactReadSchema": {
        "properties": {
          "enrolment_id": {
            "format": "uuid",
            "title": "Enrolment Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "processing": {
            "title": "Processing",
            "type": "boolean"
          },
          "reachable": {
            "title": "Reachable",
            "type": "boolean"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason"
          }
        },
        "required": [
          "enrolment_id",
          "name",
          "reachable",
          "reason",
          "processing"
        ],
        "title": "AudienceEligibilityContactReadSchema",
        "type": "object"
      },
      "AudienceEligibilityReadSchema": {
        "properties": {
          "added": {
            "title": "Added",
            "type": "integer"
          },
          "blocked": {
            "title": "Blocked",
            "type": "integer"
          },
          "capped": {
            "title": "Capped",
            "type": "boolean"
          },
          "checked": {
            "title": "Checked",
            "type": "integer"
          },
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/AudienceEligibilityContactReadSchema"
            },
            "title": "Contacts",
            "type": "array"
          },
          "groups": {
            "$ref": "#/components/schemas/ContactGroupCountsReadSchema",
            "description": "The Audience tab's tabs and their counts. Every contact sits under exactly one, and list_sequence_contacts' 'group' lists one tab."
          },
          "processing": {
            "title": "Processing",
            "type": "integer"
          },
          "reachable": {
            "title": "Reachable",
            "type": "integer"
          },
          "reasons": {
            "additionalProperties": {
              "type": "integer"
            },
            "title": "Reasons",
            "type": "object"
          }
        },
        "required": [
          "added",
          "checked",
          "reachable",
          "blocked",
          "processing",
          "capped",
          "reasons",
          "contacts",
          "groups"
        ],
        "title": "AudienceEligibilityReadSchema",
        "type": "object"
      },
      "AudiencePreviewReadSchema": {
        "properties": {
          "already_enrolled": {
            "title": "Already Enrolled",
            "type": "integer"
          },
          "browser_columns_added": {
            "description": "The columns a launch adds to the audience table for the values its Browser use steps bring back, by name; empty once launched.",
            "items": {
              "type": "string"
            },
            "title": "Browser Columns Added",
            "type": "array"
          },
          "browser_missing_columns": {
            "description": "The columns those contacts lack, by name, in the goals' order.",
            "items": {
              "type": "string"
            },
            "title": "Browser Missing Columns",
            "type": "array"
          },
          "browser_missing_contacts": {
            "default": 0,
            "description": "Of the contacts this launch writes to (enrollable plus already_enrolled), how many lack a value a Browser use step's goal requires: they enrol, and fail at that step if they reach it. The most it can be: every Browser use step is judged for every contact, whichever branch they take or whenever they reply.",
            "title": "Browser Missing Contacts",
            "type": "integer"
          },
          "capped": {
            "title": "Capped",
            "type": "boolean"
          },
          "email_deliverable": {
            "default": 0,
            "description": "Rows with an email whose deliverability verdict is one the sequence emails. Zero with no deliverability column mapped, or a cadence that sends no email.",
            "title": "Email Deliverable",
            "type": "integer"
          },
          "email_not_deliverable": {
            "default": 0,
            "description": "Rows with an email whose deliverability verdict is not one the sequence emails, so their email steps are skipped. Zero with no deliverability column mapped, or a cadence that sends no email.",
            "title": "Email Not Deliverable",
            "type": "integer"
          },
          "email_unchecked": {
            "default": 0,
            "description": "Rows with an email the deliverability column has not verified yet; their email steps wait for the verdict.",
            "title": "Email Unchecked",
            "type": "integer"
          },
          "enrollable": {
            "title": "Enrollable",
            "type": "integer"
          },
          "in_cooldown": {
            "default": 0,
            "description": "Refused by the workspace's cooldown: somebody else reached them inside the window, so enrolling them would contact them during it.",
            "title": "In Cooldown",
            "type": "integer"
          },
          "in_other_sequence": {
            "default": 0,
            "description": "Held by another live sequence right now, so a launch skips them. Counted before already_enrolled: enrollable plus already_enrolled is who this sequence would actually write to.",
            "title": "In Other Sequence",
            "type": "integer"
          },
          "missing_email": {
            "title": "Missing Email",
            "type": "integer"
          },
          "removed": {
            "default": 0,
            "description": "Rows whose contact was removed from this sequence by hand: they stay out, so a launch writes to none of them. Counted before every other reason, and in neither enrollable nor already_enrolled.",
            "title": "Removed",
            "type": "integer"
          },
          "suppressed": {
            "title": "Suppressed",
            "type": "integer"
          },
          "total_rows": {
            "title": "Total Rows",
            "type": "integer"
          },
          "with_company_domain": {
            "default": 0,
            "description": "Rows of total_rows carrying a mapped company domain.",
            "title": "With Company Domain",
            "type": "integer"
          },
          "with_email": {
            "default": 0,
            "description": "Rows of total_rows carrying a value in the mapped email column.",
            "title": "With Email",
            "type": "integer"
          },
          "with_linkedin_url": {
            "default": 0,
            "description": "Rows of total_rows carrying a mapped LinkedIn profile URL.",
            "title": "With Linkedin Url",
            "type": "integer"
          }
        },
        "required": [
          "total_rows",
          "enrollable",
          "missing_email",
          "suppressed",
          "already_enrolled",
          "capped"
        ],
        "title": "AudiencePreviewReadSchema",
        "type": "object"
      },
      "AudiencePutSchema": {
        "properties": {
          "column_mapping": {
            "$ref": "#/components/schemas/ColumnMappingSchema",
            "description": "Omit it. An empty mapping means the columns are detected from the table, which is what the dashboard sends."
          },
          "existing_contacts": {
            "default": "keep",
            "enum": [
              "keep",
              "restart"
            ],
            "title": "Existing Contacts",
            "type": "string"
          },
          "expected_updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expected Updated At"
          },
          "pause_if_running": {
            "default": false,
            "title": "Pause If Running",
            "type": "boolean"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A saved view narrowing the audience to its rows; null is the whole table.",
            "title": "View Id"
          }
        },
        "required": [
          "table_id"
        ],
        "title": "AudiencePutSchema",
        "type": "object"
      },
      "AudienceRefusalReadSchema": {
        "description": "A table a sequence cannot write to, with why, as the audience picker greys it.",
        "properties": {
          "company_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column holding each company's website, domain or LinkedIn page, which a people search's company table follows to find the people at them (the picker's Find people at these companies); null when no column looks like one.",
            "title": "Company Column Id"
          },
          "reason": {
            "description": "Why a sequence cannot use it, in the words every surface says: \"This table lists companies, not people.\"",
            "title": "Reason",
            "type": "string"
          },
          "table_id": {
            "description": "The table.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "reason",
          "company_column_id"
        ],
        "title": "AudienceRefusalReadSchema",
        "type": "object"
      },
      "AudienceReplacementPreviewReadSchema": {
        "properties": {
          "already_present": {
            "title": "Already Present",
            "type": "integer"
          },
          "capped": {
            "title": "Capped",
            "type": "boolean"
          },
          "duplicate_rows": {
            "title": "Duplicate Rows",
            "type": "integer"
          },
          "existing_contacts": {
            "title": "Existing Contacts",
            "type": "integer"
          },
          "in_cooldown": {
            "title": "In Cooldown",
            "type": "integer"
          },
          "in_other_sequence": {
            "title": "In Other Sequence",
            "type": "integer"
          },
          "keep": {
            "$ref": "#/components/schemas/AudienceDiffReadSchema",
            "description": "What keeping existing journeys does."
          },
          "missing_contact": {
            "title": "Missing Contact",
            "type": "integer"
          },
          "new_contacts": {
            "title": "New Contacts",
            "type": "integer"
          },
          "ongoing_contacts": {
            "title": "Ongoing Contacts",
            "type": "integer"
          },
          "outside_selection": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Outside Selection"
          },
          "previously_contacted": {
            "title": "Previously Contacted",
            "type": "integer"
          },
          "restart": {
            "$ref": "#/components/schemas/AudienceDiffReadSchema",
            "description": "What starting every journey fresh does."
          },
          "restart_blocked": {
            "title": "Restart Blocked",
            "type": "integer"
          },
          "restart_ready": {
            "title": "Restart Ready",
            "type": "integer"
          },
          "same_table": {
            "description": "The sequence already reads this table. Keeping journeys then applies the new filter to its contacts: those it no longer selects stop.",
            "title": "Same Table",
            "type": "boolean"
          },
          "selected_rows": {
            "title": "Selected Rows",
            "type": "integer"
          },
          "source": {
            "title": "Source",
            "type": "string"
          },
          "suppressed": {
            "title": "Suppressed",
            "type": "integer"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "updated_at",
          "selected_rows",
          "new_contacts",
          "already_present",
          "missing_contact",
          "duplicate_rows",
          "suppressed",
          "in_cooldown",
          "in_other_sequence",
          "restart_ready",
          "restart_blocked",
          "existing_contacts",
          "ongoing_contacts",
          "outside_selection",
          "previously_contacted",
          "capped",
          "source",
          "same_table",
          "keep",
          "restart"
        ],
        "title": "AudienceReplacementPreviewReadSchema",
        "type": "object"
      },
      "AudienceRestartReviewSchema": {
        "description": "An audience change that starts contacts over: who starts again, and who heard from it.",
        "properties": {
          "at_least": {
            "default": false,
            "description": "True when the table is longer than the review reads: the counts are floors.",
            "title": "At Least",
            "type": "boolean"
          },
          "contacted_before": {
            "description": "How many of the selected rows were contacted before.",
            "title": "Contacted Before",
            "type": "integer"
          },
          "contacts": {
            "description": "Contacts already in the sequence who start again from the first step.",
            "title": "Contacts",
            "type": "integer"
          }
        },
        "required": [
          "contacts",
          "contacted_before"
        ],
        "title": "AudienceRestartReviewSchema",
        "type": "object"
      },
      "AutospintaxRequestSchema": {
        "description": "The drafted body to propose spintax rotations for.",
        "properties": {
          "text": {
            "maxLength": 50000,
            "minLength": 1,
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "AutospintaxRequestSchema",
        "type": "object"
      },
      "AutospintaxResponseSchema": {
        "properties": {
          "suggestions": {
            "items": {
              "$ref": "#/components/schemas/AutospintaxSuggestionReadSchema"
            },
            "title": "Suggestions",
            "type": "array"
          }
        },
        "required": [
          "suggestions"
        ],
        "title": "AutospintaxResponseSchema",
        "type": "object"
      },
      "AutospintaxSuggestionReadSchema": {
        "properties": {
          "options": {
            "items": {
              "type": "string"
            },
            "title": "Options",
            "type": "array"
          },
          "sentence": {
            "title": "Sentence",
            "type": "string"
          }
        },
        "required": [
          "sentence",
          "options"
        ],
        "title": "AutospintaxSuggestionReadSchema",
        "type": "object"
      },
      "BacklinkGroupField": {
        "description": "The attribute a backlink search may keep a fixed number of rows per.\n\nThe vendor's ``custom_mode`` takes a RESULT field name and a count, and\noverrides ``mode`` when set: \"two backlinks per referring domain\" is the\nshape ``one_per_domain`` cannot express. Only the first two values were\nprobed live (2026-09-20: ``domain_from`` and ``anchor`` both answered,\n``domain`` was refused by name); the rest are the other string fields of\na row, offered because the vendor names no vocabulary and refuses a\nstranger with a 40501 the transport pins to this control.",
        "enum": [
          "domain_from",
          "anchor",
          "url_from",
          "tld_from",
          "domain_from_country",
          "page_from_language",
          "item_type",
          "semantic_location",
          "url_to",
          "domain_to"
        ],
        "title": "BacklinkGroupField",
        "type": "string"
      },
      "BacklinkLinkTypesFilterSchema": {
        "description": "Which kinds of link to include or exclude, from the index's own six.",
        "properties": {
          "exclude": {
            "items": {
              "enum": [
                "anchor",
                "image",
                "meta",
                "canonical",
                "alternate",
                "redirect"
              ],
              "type": "string"
            },
            "maxItems": 8,
            "title": "Exclude",
            "type": "array"
          },
          "include": {
            "items": {
              "enum": [
                "anchor",
                "image",
                "meta",
                "canonical",
                "alternate",
                "redirect"
              ],
              "type": "string"
            },
            "maxItems": 8,
            "title": "Include",
            "type": "array"
          }
        },
        "title": "BacklinkLinkTypesFilterSchema",
        "type": "object"
      },
      "BacklinkMode": {
        "description": "What one row of a backlink search is.\n\n``one_per_domain`` is the default and the lead-shaped answer: a table of\nreferring sites is a table of companies, each with a domain to enrich.\n``as_is`` is every backlink, several per site; ``one_per_anchor`` keeps\none per anchor text, which is a content question rather than a lead one.\nThe vendor's own default is ``as_is``; ours is not, because a table where\nthe same site appears forty times is not a table of leads.",
        "enum": [
          "as_is",
          "one_per_domain",
          "one_per_anchor"
        ],
        "title": "BacklinkMode",
        "type": "string"
      },
      "BacklinkReferringDomainsFilterSchema": {
        "description": "The referring sites to keep (eight at most) or to leave out (a thousand at most).",
        "properties": {
          "exclude": {
            "items": {
              "type": "string"
            },
            "maxItems": 1000,
            "title": "Exclude",
            "type": "array"
          },
          "include": {
            "items": {
              "type": "string"
            },
            "maxItems": 8,
            "title": "Include",
            "type": "array"
          }
        },
        "title": "BacklinkReferringDomainsFilterSchema",
        "type": "object"
      },
      "BacklinkSortKey": {
        "description": "The attribute a backlink search orders its rows by, in our words.\n\nEvery member is a whole-number or a date on the row: the ones an order\nmeans something for. The transport maps each to the vendor's field and\nsends it as ``order_by`` with the query's direction, by backlink rank\ndescending unless the query says otherwise, so the rows an import keeps\nare the top of an order the reader chose (``ROW_ORDER_BY_RECORD_TYPE``).",
        "enum": [
          "backlink_rank",
          "domain_rank",
          "page_rank",
          "spam_score",
          "first_seen",
          "last_seen",
          "prev_seen",
          "links_count",
          "group_count",
          "page_external_links",
          "page_internal_links",
          "page_size_bytes",
          "page_keywords_top_3",
          "page_keywords_top_10",
          "page_keywords_top_100",
          "linked_spam_score"
        ],
        "title": "BacklinkSortKey",
        "type": "string"
      },
      "BacklinkStatus": {
        "description": "Which backlinks a search returns and counts: still live, lost, or both.",
        "enum": [
          "all",
          "live",
          "lost"
        ],
        "title": "BacklinkStatus",
        "type": "string"
      },
      "BacklinkValuesFilterSchema": {
        "description": "A text filter over backlink rows, capped at eight values each way.",
        "properties": {
          "exclude": {
            "items": {
              "type": "string"
            },
            "maxItems": 8,
            "title": "Exclude",
            "type": "array"
          },
          "include": {
            "items": {
              "type": "string"
            },
            "maxItems": 8,
            "title": "Include",
            "type": "array"
          }
        },
        "title": "BacklinkValuesFilterSchema",
        "type": "object"
      },
      "BacklinksQuerySchema": {
        "description": "The sites linking to a domain or a page.\n\nName the target and get one row per referring site by default, sorted by\nthe rank the link passes. Every attribute of a backlink the index can\nfilter on is here, in four groups: the referring site, the referring\npage, the link itself, and the page it points at. The index takes at most\neight filter conditions in one search, counting every value of every list\nas one; a ninth is refused rather than dropped.",
        "properties": {
          "alt_texts": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words an image link's alt text contains."
          },
          "anchors": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words the anchor text contains."
          },
          "backlink_rank": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The rank the link passes to the target, on the scale chosen."
          },
          "dofollow": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links that pass (or do not pass) rank."
          },
          "domain_rank": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The referring site's rank, on the scale chosen."
          },
          "exclude_internal": {
            "default": true,
            "description": "Whether links from the target's own subdomains are left out.",
            "title": "Exclude Internal",
            "type": "boolean"
          },
          "first_seen_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links first found on or after this day, as YYYY-MM-DD.",
            "title": "First Seen After"
          },
          "first_seen_before": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links first found on or before this day, as YYYY-MM-DD.",
            "title": "First Seen Before"
          },
          "group_count": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many links the referring site carries in all, when rows are one per site."
          },
          "image_urls": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words an image link's image URL contains."
          },
          "include_subdomains": {
            "default": true,
            "description": "Whether links to the target's subdomains count.",
            "title": "Include Subdomains",
            "type": "boolean"
          },
          "indirect_path_types": {
            "description": "How an indirect link reaches the target: redirect or canonical. Any of them.",
            "items": {
              "enum": [
                "redirect",
                "canonical"
              ],
              "type": "string"
            },
            "maxItems": 8,
            "title": "Indirect Path Types",
            "type": "array"
          },
          "is_broken": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links pointing at a page that answers an error (or not)."
          },
          "is_indirect": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links reaching the target through a redirect or canonical (or not)."
          },
          "is_lost": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links that have been removed (or not)."
          },
          "is_new": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links first found on the last visit (or not)."
          },
          "last_seen_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links last seen on or after this day, as YYYY-MM-DD.",
            "title": "Last Seen After"
          },
          "last_seen_before": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links last seen on or before this day, as YYYY-MM-DD.",
            "title": "Last Seen Before"
          },
          "link_types": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkLinkTypesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the link is made: anchor, image, meta, canonical, alternate or redirect."
          },
          "linked_domains": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Domains the links point at, matched exactly."
          },
          "linked_spam_score": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The linked page's spam score, 0 to 100."
          },
          "linked_status_code": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The HTTP status the linked page answered."
          },
          "linked_url_https": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links pointing at an HTTPS page (or not)."
          },
          "linked_urls": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words the linked page's URL contains."
          },
          "links_count": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many identical links the referring page carries."
          },
          "mode": {
            "$ref": "#/components/schemas/BacklinkMode",
            "default": "one_per_domain",
            "description": "What one row is: one_per_domain keeps one link per referring site (the default, and the one that makes a table of leads); as_is keeps every link; one_per_anchor keeps one per anchor text."
          },
          "original": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links present on the page's first visit (or not)."
          },
          "page_encodings": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Character encodings of the referring page, like utf-8."
          },
          "page_external_links": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many external links the referring page carries."
          },
          "page_internal_links": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many internal links the referring page carries."
          },
          "page_keywords_top_10": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many keywords the referring page ranks in the top 10 for."
          },
          "page_keywords_top_100": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many keywords the referring page ranks in the top 100 for."
          },
          "page_keywords_top_3": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many keywords the referring page ranks in the top 3 for."
          },
          "page_languages": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Languages of the referring page, as ISO 639-1 codes."
          },
          "page_rank": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The referring page's rank, on the scale chosen."
          },
          "page_size_bytes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The referring page's size, in bytes."
          },
          "page_status_code": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The HTTP status the referring page answered."
          },
          "page_titles": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words the referring page's title contains."
          },
          "per_field": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkGroupField"
              },
              {
                "type": "null"
              }
            ],
            "description": "Keep a fixed number of links per value of this attribute instead of using mode: domain_from for a few links per referring site, anchor for a few per anchor text. Needs per_field_limit."
          },
          "per_field_limit": {
            "anyOf": [
              {
                "maximum": 1000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many links to keep per value of per_field.",
            "title": "Per Field Limit"
          },
          "prev_seen_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links whose visit before last was on or after this day, as YYYY-MM-DD.",
            "title": "Prev Seen After"
          },
          "prev_seen_before": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only links whose visit before last was on or before this day, as YYYY-MM-DD.",
            "title": "Prev Seen Before"
          },
          "rank_scale": {
            "$ref": "#/components/schemas/RankScale",
            "default": "one_hundred",
            "description": "The scale the three ranks are reported and filtered on: 0 to 100 (the default) or 0 to 1000."
          },
          "redirect_targets": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words the redirect's final URL contains."
          },
          "referring_countries": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Countries of the referring site, as ISO alpha-2 codes or picker names."
          },
          "referring_domain_is_ip": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only referring sites that are (or are not) a bare IP address."
          },
          "referring_domains": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkReferringDomainsFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Referring sites, by host, matched exactly. Up to a thousand left out: past the eight conditions a search takes, they are dropped from the rows as they arrive, and the count still includes them."
          },
          "referring_ips": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "IP addresses of the referring site."
          },
          "referring_platform_types": {
            "description": "Kinds of referring site to keep, any of them: cms, blogs, ecommerce, message-boards, wikis, news, organization or unknown. There is no exclude.",
            "items": {
              "enum": [
                "cms",
                "blogs",
                "ecommerce",
                "message-boards",
                "wikis",
                "news",
                "organization",
                "unknown"
              ],
              "type": "string"
            },
            "maxItems": 8,
            "title": "Referring Platform Types",
            "type": "array"
          },
          "referring_tlds": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Top-level domains of the referring site, like com or edu."
          },
          "referring_url_https": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only referring pages served over HTTPS (or not)."
          },
          "referring_urls": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words the referring page's URL contains."
          },
          "semantic_locations": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The HTML element the link sits in: article, section, footer, nav and so on."
          },
          "sort_by": {
            "$ref": "#/components/schemas/BacklinkSortKey",
            "default": "backlink_rank",
            "description": "Which attribute orders the rows, and so which rows an import keeps when more match than it adds. Backlink rank by default."
          },
          "sort_descending": {
            "default": true,
            "description": "Highest or latest first.",
            "title": "Sort Descending",
            "type": "boolean"
          },
          "spam_score": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The link's spam score, 0 to 100."
          },
          "status": {
            "$ref": "#/components/schemas/BacklinkStatus",
            "default": "live",
            "description": "Which links are returned and counted: live (still found on the last visit, the default), lost, or all."
          },
          "target": {
            "anyOf": [
              {
                "maxLength": 2048,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The site whose backlinks to find: a domain or subdomain written bare (acme.com, blog.acme.com), or a page as its whole URL. Required; nothing else can anchor a backlink search.",
            "title": "Target"
          },
          "text_after": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words the text just after the link contains."
          },
          "text_before": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinkValuesFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words the text just before the link contains."
          }
        },
        "title": "BacklinksQuerySchema",
        "type": "object"
      },
      "BillingPortalRequestSchema": {
        "description": "Request schema for creating a billing portal session.",
        "properties": {
          "return_path": {
            "default": "/billing",
            "description": "Partial path (e.g. /billing) the portal's 'return to site' link goes to.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Return Path",
            "type": "string"
          }
        },
        "title": "BillingPortalRequestSchema",
        "type": "object"
      },
      "BillingPortalResponseSchema": {
        "description": "Response schema for billing portal session.",
        "properties": {
          "url": {
            "description": "The URL to redirect the customer to access the billing portal.",
            "format": "uri",
            "maxLength": 2083,
            "minLength": 1,
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "title": "BillingPortalResponseSchema",
        "type": "object"
      },
      "Body_create_table_import_csv": {
        "properties": {
          "file": {
            "description": "The .csv or .xlsx file to import.",
            "format": "binary",
            "title": "File",
            "type": "string"
          }
        },
        "required": [
          "file"
        ],
        "title": "Body_create_table_import_csv",
        "type": "object"
      },
      "Body_forward_message": {
        "properties": {
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mailbox Id"
          },
          "note": {
            "default": "",
            "maxLength": 100000,
            "title": "Note",
            "type": "string"
          },
          "to": {
            "maxLength": 2000,
            "minLength": 1,
            "title": "To",
            "type": "string"
          }
        },
        "required": [
          "to"
        ],
        "title": "Body_forward_message",
        "type": "object"
      },
      "Body_reply_in_thread": {
        "properties": {
          "bcc": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Bcc"
          },
          "body_text": {
            "maxLength": 100000,
            "minLength": 1,
            "title": "Body Text",
            "type": "string"
          },
          "cc": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cc"
          },
          "channel": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InboxChannel"
              },
              {
                "type": "null"
              }
            ]
          },
          "files": {
            "anyOf": [
              {
                "items": {
                  "format": "binary",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Files"
          },
          "include_history": {
            "default": false,
            "title": "Include History",
            "type": "boolean"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mailbox Id"
          },
          "omit_signature": {
            "default": false,
            "title": "Omit Signature",
            "type": "boolean"
          },
          "reply_to_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reply To Message Id"
          },
          "signature_block": {
            "anyOf": [
              {
                "maxLength": 4000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Signature Block"
          },
          "subject": {
            "anyOf": [
              {
                "maxLength": 998,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          },
          "to": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "To"
          }
        },
        "required": [
          "body_text"
        ],
        "title": "Body_reply_in_thread",
        "type": "object"
      },
      "Body_upload_ai_context_document": {
        "properties": {
          "file": {
            "description": "The document to attach.",
            "format": "binary",
            "title": "File",
            "type": "string"
          }
        },
        "required": [
          "file"
        ],
        "title": "Body_upload_ai_context_document",
        "type": "object"
      },
      "Body_upload_chat_attachment": {
        "properties": {
          "file": {
            "description": "The .csv, .xlsx or .pdf file to send.",
            "format": "binary",
            "title": "File",
            "type": "string"
          }
        },
        "required": [
          "file"
        ],
        "title": "Body_upload_chat_attachment",
        "type": "object"
      },
      "BounceSeverity": {
        "description": "Hard vs soft severity of a BOUNCE message.\n\nOnly HARD marks the contact bounced (the Bounced condition, the enrolment\nanalytics bounce rate, the per-message outcome). SOFT still fills the\nBounces view and never looks like a reply, but the address may still be\nreachable, so the cadence is left alone.",
        "enum": [
          "hard",
          "soft"
        ],
        "title": "BounceSeverity",
        "type": "string"
      },
      "BranchSplitReadSchema": {
        "description": "How a branching step divided its contacts.",
        "properties": {
          "branches": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "A connection request's contacts per branch it sent them down: connected, already_connected (when it has that branch) and not_accepted.",
            "propertyNames": {
              "$ref": "#/components/schemas/SequenceEdgeBranch"
            },
            "title": "Branches",
            "type": "object"
          },
          "no": {
            "description": "A condition's No branch. Zero on a connection request.",
            "title": "No",
            "type": "integer"
          },
          "reasons": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "A connection request's contacts per reason they took their branch: accepted, already_connected, expired, declined, or why no request could go out.",
            "propertyNames": {
              "$ref": "#/components/schemas/InviteOutcome"
            },
            "title": "Reasons",
            "type": "object"
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "yes": {
            "description": "A condition's Yes branch. Zero on a connection request.",
            "title": "Yes",
            "type": "integer"
          }
        },
        "required": [
          "step_id",
          "yes",
          "no"
        ],
        "title": "BranchSplitReadSchema",
        "type": "object"
      },
      "BrowserOutcomeSchema": {
        "description": "One way a Browser use step's goal can end.",
        "properties": {
          "key": {
            "$ref": "#/components/schemas/SequenceEdgeBranch",
            "description": "The branch the outcome's connection leaves by, one of the outcome slots. A new outcome takes a slot the step has never used; a slot an earlier outcome gave up is refused."
          },
          "label": {
            "description": "What the outcome is called (\"Account created\"), unique in the step.",
            "maxLength": 40,
            "minLength": 1,
            "title": "Label",
            "type": "string"
          }
        },
        "required": [
          "key",
          "label"
        ],
        "title": "BrowserOutcomeSchema",
        "type": "object"
      },
      "BrowserOutputSchema": {
        "description": "One value a Browser use run brings back beside its outcome, kept in its own column.",
        "properties": {
          "choices": {
            "description": "A select value's options; empty for any other type.",
            "items": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 200,
            "title": "Choices",
            "type": "array"
          },
          "description": {
            "default": "",
            "description": "What the value should hold, shown to the agent.",
            "maxLength": 500,
            "title": "Description",
            "type": "string"
          },
          "field_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "default": "text",
            "description": "The type the value is brought back as."
          },
          "hidden": {
            "default": false,
            "description": "Keep the value out of sight (a password): its cells show a mask, and only the contact's history shows the value.",
            "title": "Hidden",
            "type": "boolean"
          },
          "key": {
            "description": "The step's own id for the value, \"out_\" and a number. It names the column the value is kept in, so a rename keeps the column; a removed value's key is never given out again.",
            "pattern": "^out_[1-9]\\d{0,2}$",
            "title": "Key",
            "type": "string"
          },
          "name": {
            "description": "What the value and its column are called (\"Username\").",
            "maxLength": 60,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "key",
          "name"
        ],
        "title": "BrowserOutputSchema",
        "type": "object"
      },
      "BrowserRefusal": {
        "description": "Why the cloud browser refused a run's start, before any browser command went out.\n\nEither way the run goes back in line unstarted and is tried again\n(``sequence_browser_run.last_refusal``): nothing ran, so nothing is charged\nand nobody is asked.",
        "enum": [
          "capacity",
          "unavailable"
        ],
        "title": "BrowserRefusal",
        "type": "string"
      },
      "BrowserReplayPageReadSchema": {
        "description": "One page of a run's recording, played by its own playlist.",
        "properties": {
          "end_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where it ends, in milliseconds; null while it is still being recorded.",
            "title": "End Ms"
          },
          "page_id": {
            "description": "The page, for its playlist's download.",
            "title": "Page Id",
            "type": "string"
          },
          "start_ms": {
            "description": "Where the page starts in the recording, in milliseconds.",
            "title": "Start Ms",
            "type": "integer"
          }
        },
        "required": [
          "page_id",
          "start_ms",
          "end_ms"
        ],
        "title": "BrowserReplayPageReadSchema",
        "type": "object"
      },
      "BrowserReplayReadSchema": {
        "description": "Whether a run's recording can be watched, and its pages.",
        "properties": {
          "pages": {
            "description": "The recording's pages in order; empty unless ready.",
            "items": {
              "$ref": "#/components/schemas/BrowserReplayPageReadSchema"
            },
            "title": "Pages",
            "type": "array"
          },
          "site": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The first site the run's browser landed on; null when it landed on none.",
            "title": "Site"
          },
          "started_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the run's browser opened; null when it never did.",
            "title": "Started At"
          },
          "status": {
            "$ref": "#/components/schemas/BrowserReplayStatus",
            "description": "ready: the pages below play; expired: the browser ran, and its recording is no longer kept; none: the browser never opened, so nothing was recorded."
          }
        },
        "required": [
          "status",
          "pages"
        ],
        "title": "BrowserReplayReadSchema",
        "type": "object"
      },
      "BrowserReplayStatus": {
        "description": "Whether a run's recording can be watched.",
        "enum": [
          "ready",
          "expired",
          "none"
        ],
        "title": "BrowserReplayStatus",
        "type": "string"
      },
      "BrowserRevealedOutputReadSchema": {
        "description": "One value a run kept out of sight.",
        "properties": {
          "key": {
            "description": "The output's slot on the step.",
            "title": "Key",
            "type": "string"
          },
          "name": {
            "description": "The step's name for it.",
            "title": "Name",
            "type": "string"
          },
          "value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The value; null when the run found none.",
            "title": "Value"
          }
        },
        "required": [
          "key",
          "name",
          "value"
        ],
        "title": "BrowserRevealedOutputReadSchema",
        "type": "object"
      },
      "BrowserRevealedOutputsReadSchema": {
        "description": "The values a run kept out of sight, shown to the person who asked.",
        "properties": {
          "data": {
            "description": "Each hidden value, in the step's order; empty when the run kept none.",
            "items": {
              "$ref": "#/components/schemas/BrowserRevealedOutputReadSchema"
            },
            "title": "Data",
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "title": "BrowserRevealedOutputsReadSchema",
        "type": "object"
      },
      "BrowserRunOutputReadSchema": {
        "description": "One value a Browser use run brought back.",
        "properties": {
          "found": {
            "description": "Whether the run brought a value back. True for a hidden value it kept, which a reveal shows; false when it found nothing, so there is nothing to reveal.",
            "title": "Found",
            "type": "boolean"
          },
          "hidden": {
            "title": "Hidden",
            "type": "boolean"
          },
          "key": {
            "title": "Key",
            "type": "string"
          },
          "name": {
            "description": "The value's name on the step; its key once the step drops it.",
            "title": "Name",
            "type": "string"
          },
          "value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the run found. Null for a value it did not find, and for a hidden one (a password the run made), which only an audited reveal shows.",
            "title": "Value"
          }
        },
        "required": [
          "key",
          "name",
          "hidden",
          "found"
        ],
        "title": "BrowserRunOutputReadSchema",
        "type": "object"
      },
      "BrowserRunReadSchema": {
        "description": "What one Browser use run did for the contact.",
        "properties": {
          "billed_minutes": {
            "default": 0,
            "description": "The browser minutes the run was billed for: its browser's length, rounded up, never past a run's most minutes. 0 until it settles, and for a run whose browser never opened.",
            "title": "Billed Minutes",
            "type": "integer"
          },
          "charged_credits": {
            "description": "What the run was charged: its browser's minutes, rounded up, at the per-minute price. 0 until it settles, and for a run whose browser never opened.",
            "title": "Charged Credits",
            "type": "number"
          },
          "failure": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why it ended without the agent's choice: time_limit, budget, interrupted, page_unreadable, model_error, unavailable or out_of_credits (the workspace's credits could not hold its next stretch of browsing). Null when the agent chose.",
            "title": "Failure"
          },
          "finished_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Finished At"
          },
          "has_replay": {
            "description": "Whether its browser opened, so a recording may exist.",
            "title": "Has Replay",
            "type": "boolean"
          },
          "last_refusal": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BrowserRefusal"
              },
              {
                "type": "null"
              }
            ],
            "description": "While the run waits in line: why the cloud browser refused its last start. capacity (every browser in use) reads Waiting for browser; unavailable (an outage at the vendor) reads Browser use is unavailable right now. Either way it is tried again on its own and nothing is charged. Null once its browser opens."
          },
          "outcome_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The branch it took: one of the step's outcome slots, or needs_human.",
            "title": "Outcome Key"
          },
          "outcome_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "That outcome's words, as the step named it when it settled.",
            "title": "Outcome Label"
          },
          "outputs": {
            "description": "The values the run looked for or found, once it settled. A value it never got to is not listed; one it looked for and did not find has found false.",
            "items": {
              "$ref": "#/components/schemas/BrowserRunOutputReadSchema"
            },
            "title": "Outputs",
            "type": "array"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why, in one sentence.",
            "title": "Reason"
          },
          "run_id": {
            "description": "The run, for its replay.",
            "format": "uuid",
            "title": "Run Id",
            "type": "string"
          },
          "started_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Started At"
          },
          "status": {
            "$ref": "#/components/schemas/BrowserRunStatus",
            "description": "queued while it waits for a browser, running, or settled once over."
          },
          "steps": {
            "description": "What the agent did, in order.",
            "items": {
              "$ref": "#/components/schemas/AiStep"
            },
            "title": "Steps",
            "type": "array"
          }
        },
        "required": [
          "run_id",
          "status",
          "has_replay",
          "charged_credits"
        ],
        "title": "BrowserRunReadSchema",
        "type": "object"
      },
      "BrowserRunStatus": {
        "description": "Where one Browser use run stands on its ledger row (``sequence_browser_run.status``).\n\n``QUEUED`` waits in the platform's line for a browser; ``RUNNING`` was\nstarted by the dispatcher and holds a lease (``lease_until``); ``SETTLED``\nis over, whether it reached an outcome or never ran.",
        "enum": [
          "queued",
          "running",
          "settled"
        ],
        "title": "BrowserRunStatus",
        "type": "string"
      },
      "BrowserStepConfigSchema-Input": {
        "description": "A Browser use step's setup: its goal, the outcomes it ends on, the values it brings back.",
        "properties": {
          "goal_segments": {
            "description": "What the browser should do for each contact, with the contact's columns as variables. A step with no goal can be saved but not launched.",
            "items": {
              "$ref": "#/components/schemas/TemplateSegmentSchema"
            },
            "maxItems": 200,
            "title": "Goal Segments",
            "type": "array"
          },
          "inbox_access": {
            "default": false,
            "description": "Let a run read the sender's inbox for a code or a link the site emails (a sign-up's confirmation).",
            "title": "Inbox Access",
            "type": "boolean"
          },
          "outcomes": {
            "description": "The ways the goal can end, each with its own branch. Needs human is always there besides them, for a run that needs a person.",
            "items": {
              "$ref": "#/components/schemas/BrowserOutcomeSchema"
            },
            "maxItems": 8,
            "minItems": 1,
            "title": "Outcomes",
            "type": "array"
          },
          "outputs": {
            "description": "The values a run brings back beside its outcome.",
            "items": {
              "$ref": "#/components/schemas/BrowserOutputSchema"
            },
            "maxItems": 8,
            "title": "Outputs",
            "type": "array"
          },
          "retired_outcome_keys": {
            "description": "Read-only: the outcome slots this step gave up; ignored on write.",
            "items": {
              "$ref": "#/components/schemas/SequenceEdgeBranch"
            },
            "maxItems": 8,
            "title": "Retired Outcome Keys",
            "type": "array"
          },
          "retired_output_keys": {
            "description": "Read-only: the value keys this step gave up; ignored on write.",
            "items": {
              "pattern": "^out_[1-9]\\d{0,2}$",
              "type": "string"
            },
            "maxItems": 999,
            "title": "Retired Output Keys",
            "type": "array"
          }
        },
        "required": [
          "outcomes"
        ],
        "title": "BrowserStepConfigSchema",
        "type": "object"
      },
      "BrowserStepConfigSchema-Output": {
        "description": "A Browser use step's setup: its goal, the outcomes it ends on, the values it brings back.",
        "properties": {
          "goal_segments": {
            "description": "What the browser should do for each contact, with the contact's columns as variables. A step with no goal can be saved but not launched.",
            "items": {
              "$ref": "#/components/schemas/TemplateSegmentSchema"
            },
            "maxItems": 200,
            "title": "Goal Segments",
            "type": "array"
          },
          "inbox_access": {
            "default": false,
            "description": "Let a run read the sender's inbox for a code or a link the site emails (a sign-up's confirmation).",
            "title": "Inbox Access",
            "type": "boolean"
          },
          "outcomes": {
            "description": "The ways the goal can end, each with its own branch. Needs human is always there besides them, for a run that needs a person.",
            "items": {
              "$ref": "#/components/schemas/BrowserOutcomeSchema"
            },
            "maxItems": 8,
            "minItems": 1,
            "title": "Outcomes",
            "type": "array"
          },
          "outputs": {
            "description": "The values a run brings back beside its outcome.",
            "items": {
              "$ref": "#/components/schemas/BrowserOutputSchema"
            },
            "maxItems": 8,
            "title": "Outputs",
            "type": "array"
          },
          "retired_outcome_keys": {
            "description": "Read-only: the outcome slots this step gave up; ignored on write.",
            "items": {
              "$ref": "#/components/schemas/SequenceEdgeBranch"
            },
            "maxItems": 8,
            "title": "Retired Outcome Keys",
            "type": "array"
          },
          "retired_output_keys": {
            "description": "Read-only: the value keys this step gave up; ignored on write.",
            "items": {
              "pattern": "^out_[1-9]\\d{0,2}$",
              "type": "string"
            },
            "maxItems": 999,
            "title": "Retired Output Keys",
            "type": "array"
          }
        },
        "required": [
          "outcomes"
        ],
        "title": "BrowserStepConfigSchema",
        "type": "object"
      },
      "BrowserTrialCreateSchema": {
        "description": "Which contact of the audience to try a Browser use step on.",
        "properties": {
          "record_id": {
            "description": "The audience row.",
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          }
        },
        "required": [
          "record_id"
        ],
        "title": "BrowserTrialCreateSchema",
        "type": "object"
      },
      "BrowserTrialPreviewSchema": {
        "description": "What trying a Browser use step on one contact would do, before it starts.",
        "properties": {
          "acts_as_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The mailbox the agent would act as: the one that emails the contact, else the one a run would assign them (not recorded by a trial). Null when already running.",
            "title": "Acts As Address"
          },
          "acts_as_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender the agent would act as for this contact; null when one runs.",
            "title": "Acts As Name"
          },
          "already_running": {
            "description": "The step's trial is already in line or running, so a trial asked for now would start nothing: one trial of a step at a time.",
            "title": "Already Running",
            "type": "boolean"
          },
          "max_credits": {
            "description": "The most the trial may charge: every minute it may use, at the price.",
            "title": "Max Credits",
            "type": "number"
          },
          "trial": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BrowserTrialReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step's trial already in line or running; null when there is none."
          }
        },
        "required": [
          "already_running",
          "trial",
          "max_credits"
        ],
        "title": "BrowserTrialPreviewSchema",
        "type": "object"
      },
      "BrowserTrialReadSchema": {
        "description": "A Browser use step's trial on one contact: who, as whom, and what it did.",
        "properties": {
          "acts_as": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The mailbox the agent acted as; null until its browser was claimed.",
            "title": "Acts As"
          },
          "contact_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's name off their row, else their address; null once gone.",
            "title": "Contact Label"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "description": "The trial, for its replay and its hidden values.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "record_id": {
            "description": "The audience row it was tried on.",
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "run": {
            "$ref": "#/components/schemas/BrowserRunReadSchema",
            "description": "What it did, in a contact's run's own shape. A trial never moves its contact, writes a cell or counts in the step's numbers."
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "step_id",
          "record_id",
          "created_at",
          "run"
        ],
        "title": "BrowserTrialReadSchema",
        "type": "object"
      },
      "BuiltInMessageTemplateReadSchema": {
        "description": "One template we ship, the same in every workspace: a cold email with blanks to fill.",
        "properties": {
          "body_segments": {
            "items": {
              "$ref": "#/components/schemas/TemplateSegmentSchema"
            },
            "title": "Body Segments",
            "type": "array"
          },
          "description": {
            "description": "What the template is for, in a few words.",
            "title": "Description",
            "type": "string"
          },
          "follow_up": {
            "description": "Written to nudge an earlier email: listed first on a follow-up, and not at all on a sequence's first email.",
            "title": "Follow Up",
            "type": "boolean"
          },
          "key": {
            "title": "Key",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "key",
          "name",
          "description",
          "body_segments",
          "follow_up"
        ],
        "title": "BuiltInMessageTemplateReadSchema",
        "type": "object"
      },
      "BuiltinAgentSettings": {
        "description": "Settings for a built-in agent column: which columns supply which facts.\n\nThe same contract an :class:`EnrichmentSettings` column carries, and for\nthe same reason. A built-in agent is configured entirely server-side\n(prompt, model, reach and output shape all live on the agent row), so the\nONE thing a column decides is where each declared input comes from.\n\nThose bound cells are also all the agent sees. Its predecessor folded in\nthe whole row (optionally narrowed to a chosen subset), which made the\nsame agent read a different question on every table, cost the most on the\nwidest ones, and quietly answer from whatever cell happened to sit beside\nthe one it wanted. Now an input reaches the prompt only by being declared\nand bound, keyed by the agent's CANONICAL name (``domain``,\n``full_name``), so renaming a column changes nothing here.\n\nA stored binding whose declaration is gone is ignored rather than\nresurrecting a fact nobody asked for.",
        "properties": {
          "input_bindings": {
            "additionalProperties": {
              "format": "uuid",
              "type": "string"
            },
            "description": "Declared input name \u2192 the column that supplies it.",
            "maxProperties": 8,
            "title": "Input Bindings",
            "type": "object"
          },
          "kind": {
            "const": "builtin",
            "default": "builtin",
            "title": "Kind",
            "type": "string"
          }
        },
        "title": "BuiltinAgentSettings",
        "type": "object"
      },
      "BuiltinAgentShelf": {
        "description": "The Enrichment tab shelf a built-in agent is ALSO listed on.\n\nA built-in agent lives on the Agent tab, where it sits beside the agents a\ncustomer wrote. The ones that answer an outcome someone shops the\nEnrichment tab for (research a company, write the email) are listed there\ntoo, on a shelf of their own after the data shelves, because that is where\npeople look for them. Authored per agent in ``agents_catalog.yaml`` so the\nshelf is decided where the agent is defined, the way a waterfall's family\nis, rather than guessed from a label in the frontend.",
        "enum": [
          "research",
          "write"
        ],
        "title": "BuiltinAgentShelf",
        "type": "string"
      },
      "BuiltinAgentTemplateSchema": {
        "description": "One built-in agent, disclosed as a copyable starting point.\n\nThe agents page renders these as its template cards; picking one copies\nevery field into a fresh saved-agent editor. Deliberately the opposite of\nthe picker's action spec, which HIDES prompt and model because a built-in\ncolumn is configured server-side. A template exists to be read and\nowned, so full disclosure is the feature.\n\nThe agent's instructions are its ``prompt`` in full. The stored\n``extra_context`` is NOT disclosed: it is the platform's own answering\nrulebook, composed at reconcile time and tied to how built-in runs are\npriced and refunded, not prose an owner wrote or should inherit.",
        "properties": {
          "description": {
            "title": "Description",
            "type": "string"
          },
          "icon": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Lucide icon token; null renders the default.",
            "title": "Icon"
          },
          "inputs": {
            "description": "The agent's declared inputs, carried over so a copy keeps the same contract. A built-in binds these to columns rather than naming them in its prompt, so the copied prompt references none of them until its new owner does.",
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "title": "Inputs",
            "type": "array"
          },
          "is_template": {
            "description": "Whether this one is curated as a worked example. Every visible built-in is listed; the agents hub features the curated few as cards and leaves the rest to the gallery.",
            "title": "Is Template",
            "type": "boolean"
          },
          "key": {
            "title": "Key",
            "type": "string"
          },
          "model_key": {
            "title": "Model Key",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "output_schema": {
            "discriminator": {
              "mapping": {
                "fields": "#/components/schemas/EnrichmentOutputFields-Output",
                "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
              },
              "propertyName": "mode"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnrichmentOutputFields-Output"
              },
              {
                "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
              }
            ],
            "title": "Output Schema"
          },
          "prompt": {
            "title": "Prompt",
            "type": "string"
          },
          "prompt_template": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Output",
            "description": "The prompt as editor-ready segments: what a copied template seeds the saved-agent editor with."
          },
          "tagline": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tagline"
          },
          "use_business_context": {
            "description": "Whether runs fold in the org's AI business context. Copied into the saved agent so a template built around it keeps working.",
            "title": "Use Business Context",
            "type": "boolean"
          },
          "web_research": {
            "title": "Web Research",
            "type": "boolean"
          }
        },
        "required": [
          "key",
          "name",
          "description",
          "tagline",
          "icon",
          "model_key",
          "prompt",
          "web_research",
          "use_business_context",
          "prompt_template",
          "inputs",
          "is_template",
          "output_schema"
        ],
        "title": "BuiltinAgentTemplateSchema",
        "type": "object"
      },
      "BuiltinVariable": {
        "description": "Non-column variables the composer offers.\n\nWeekday variables render the *name* of the day (\"Thursday\") so a cadence\ncan reference real days without weekly rewrites.",
        "enum": [
          "sender_first_name",
          "sender_full_name",
          "sender_title",
          "sender_booking_link",
          "sending_domain",
          "sequence_name",
          "greeting",
          "today",
          "yesterday",
          "tomorrow",
          "day_plus_2",
          "day_plus_3",
          "day_plus_4"
        ],
        "title": "BuiltinVariable",
        "type": "string"
      },
      "BulkApproveSchema": {
        "description": "The ticked rows, and which of them the person had opened.",
        "properties": {
          "opened_task_ids": {
            "description": "The ticked tasks the person opened and read before approving. Words the agent wrote on those that nobody changed are recorded as approved as written: a record of their Looks good, which saves no learning.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 200,
            "title": "Opened Task Ids",
            "type": "array"
          },
          "task_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Task Ids",
            "type": "array"
          }
        },
        "required": [
          "task_ids"
        ],
        "title": "BulkApproveSchema",
        "type": "object"
      },
      "BulkDecisionResponseSchema": {
        "description": "What the batch actually did, so the page can say so in one sentence.",
        "properties": {
          "saved_learnings": {
            "default": 0,
            "description": "For an approval, how many learnings a Needs work proposed on the approved rows it saved; each writes again the waiting messages it reaches. On a dry run, how many the ticked rows carry, which approving them would save. 0 for a rejection.",
            "title": "Saved Learnings",
            "type": "integer"
          },
          "saved_learnings_for_all_sequences": {
            "default": 0,
            "description": "Of saved_learnings, how many apply to every sequence, not only their own.",
            "title": "Saved Learnings For All Sequences",
            "type": "integer"
          },
          "saved_needs_work": {
            "default": 0,
            "description": "How many Needs work the approval saved (or would, on a dry run); one Needs work can change several learnings, which saved_learnings counts.",
            "title": "Saved Needs Work",
            "type": "integer"
          },
          "schedule": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OutreachApprovalScheduleReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "For an approval, when the approved work is expected to run: per sender for LinkedIn, and the emails' count and start. Null for a rejection, and when the schedule could not be read (the approval stands either way)."
          },
          "skipped": {
            "description": "How many had already moved on (settled, decided by somebody else, or a task nobody approves), and how many LinkedIn steps LinkedIn could not take now (the sender is not connected), which still wait. Not an error: a selection goes stale while it is read.",
            "title": "Skipped",
            "type": "integer"
          },
          "updated": {
            "description": "How many rows the decision applied to.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "skipped"
        ],
        "title": "BulkDecisionResponseSchema",
        "type": "object"
      },
      "BulkHealthCheckSelectionSchema": {
        "description": "Integration selection for a bulk health check.\n\nEither an explicit ``ids`` list (the per-page selection) OR a ``filters``-based\nselect-all that spans every page (optionally minus ``exclude_ids``). Exactly one of\n``ids`` / ``filters`` must be provided. A select-all that names no filter checks every\nintegration only when ``all`` is true, so a request that lost its filters checks nothing.",
        "properties": {
          "all": {
            "default": false,
            "description": "Check every integration. Required when `filters` names no filter at all; ignored when it names one.",
            "title": "All",
            "type": "boolean"
          },
          "exclude_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 10000,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Integration IDs to exclude from a filter-based (select-all) selection.",
            "title": "Exclude Ids"
          },
          "filters": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ListIntegrationsFilterParamsSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Select-all: check every integration matching these filters (all pages)."
          },
          "ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 10000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Explicit integration IDs to check (per-page selection).",
            "title": "Ids"
          }
        },
        "title": "BulkHealthCheckSelectionSchema",
        "type": "object"
      },
      "BulkLabelUpdateSchema": {
        "properties": {
          "ids": {
            "description": "The conversations to label.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          },
          "label_id": {
            "format": "uuid",
            "title": "Label Id",
            "type": "string"
          }
        },
        "required": [
          "ids",
          "label_id"
        ],
        "title": "BulkLabelUpdateSchema",
        "type": "object"
      },
      "BulkRejectSchema": {
        "description": "The ticked rows and the one note about the people that settles them all.",
        "properties": {
          "reason": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Optional note kept on every task it settled about why these people should not hear from their sequences. Never about the writing (Needs work is). Saves no learning. The screen sends none.",
            "title": "Reason"
          },
          "task_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Task Ids",
            "type": "array"
          }
        },
        "required": [
          "task_ids"
        ],
        "title": "BulkRejectSchema",
        "type": "object"
      },
      "BulkSuppressSchema": {
        "properties": {
          "ids": {
            "description": "The conversations whose contacts to put on Do not contact.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "title": "BulkSuppressSchema",
        "type": "object"
      },
      "CampaignBrief": {
        "additionalProperties": false,
        "description": "What one sequence's campaign was: the library campaign tailoring chose for it and why.\n\nLegacy, read only. Written by campaign tailoring, which was removed on\n2026-10-26; nothing writes a new one. Sequences tailored before carry it,\nand the writer still reads it for them, so every field stays (a stored\nversion that names one must keep loading). The Agent tab reads it and\nnever sends it back (the service keeps the stored one on every other\nwrite), and copying an agent copies it. ``audience``, ``why_now``,\n``angle`` and ``step_notes`` were written by a model from the audience\ntable, so they are background, never facts: only ``intent``, the\nperson's own words, may be stated as fact.",
        "properties": {
          "angle": {
            "default": "",
            "maxLength": 300,
            "title": "Angle",
            "type": "string"
          },
          "audience": {
            "default": "",
            "maxLength": 300,
            "title": "Audience",
            "type": "string"
          },
          "campaign_key": {
            "maxLength": 64,
            "title": "Campaign Key",
            "type": "string"
          },
          "chosen_by_person": {
            "default": false,
            "title": "Chosen By Person",
            "type": "boolean"
          },
          "goal": {
            "default": "",
            "maxLength": 1000,
            "title": "Goal",
            "type": "string"
          },
          "intent": {
            "default": "",
            "maxLength": 500,
            "title": "Intent",
            "type": "string"
          },
          "minted": {
            "items": {
              "maxLength": 64,
              "type": "string"
            },
            "maxItems": 50,
            "title": "Minted",
            "type": "array"
          },
          "reason": {
            "default": "",
            "maxLength": 300,
            "title": "Reason",
            "type": "string"
          },
          "step_notes": {
            "additionalProperties": {
              "maxLength": 300,
              "type": "string"
            },
            "maxProperties": 50,
            "propertyNames": {
              "maxLength": 64
            },
            "title": "Step Notes",
            "type": "object"
          },
          "table_name": {
            "default": "",
            "maxLength": 255,
            "title": "Table Name",
            "type": "string"
          },
          "tailoring_off": {
            "default": false,
            "title": "Tailoring Off",
            "type": "boolean"
          },
          "why_now": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Why Now"
          }
        },
        "required": [
          "campaign_key"
        ],
        "title": "CampaignBrief",
        "type": "object"
      },
      "CardLandingSchema": {
        "description": "The table a lead search's card would make: its name, how many it adds, a few who match.\n\nThe card leads with it, so a person sees the list they asked for before\napproving it. Every word is the server's; the dashboard draws it as given.",
        "properties": {
          "adds": {
            "description": "How many rows it adds out of how many match: \"Adds 10 of 608 people\".",
            "title": "Adds",
            "type": "string"
          },
          "place": {
            "default": "",
            "description": "Whose place the search applies, in its step line's words: \"People in London \u00b7 HQ in United Kingdom\". Empty when it names no place.",
            "title": "Place",
            "type": "string"
          },
          "sample_columns": {
            "description": "The sample's column names, as the table names them.",
            "items": {
              "type": "string"
            },
            "title": "Sample Columns",
            "type": "array"
          },
          "sample_rows": {
            "description": "A few who match, one value per column. Empty for a search whose rows are bought.",
            "items": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "title": "Sample Rows",
            "type": "array"
          },
          "table_name": {
            "description": "The new table's name, the card's title.",
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_name",
          "adds"
        ],
        "title": "CardLandingSchema",
        "type": "object"
      },
      "CardSearchSchema": {
        "description": "A lead search a card lists the filters of, as the search route takes it.\n\nDrawn by the dashboard through the Find leads page's own summary, so a\ncard names each filter as the page does, never by its route name.",
        "properties": {
          "query": {
            "additionalProperties": true,
            "description": "The search's filters, filter name to value.",
            "title": "Query",
            "type": "object"
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType",
            "description": "Which lead search it is."
          }
        },
        "required": [
          "record_type"
        ],
        "title": "CardSearchSchema",
        "type": "object"
      },
      "CategoryReadSchema": {
        "properties": {
          "description": {
            "description": "The description of the category.",
            "title": "Description",
            "type": "string"
          },
          "id": {
            "description": "The category's id.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "integration_count": {
            "description": "Number of integrations in this category (includes 'coming soon'; static regardless of search).",
            "title": "Integration Count",
            "type": "integer"
          },
          "name": {
            "description": "The name of the category.",
            "title": "Name",
            "type": "string"
          },
          "slug": {
            "description": "The slug of the category.",
            "title": "Slug",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "slug",
          "description",
          "integration_count"
        ],
        "title": "CategoryReadSchema",
        "type": "object"
      },
      "CellFeedbackBulkRequestSchema": {
        "description": "One verdict, applied to many cells.\n\nThe rating and the note are shared on purpose: a swept selection is one\njudgement about one thing the column got wrong, so asking for the sentence\nN times would collect N copies of it.",
        "properties": {
          "cells": {
            "description": "The cells to rate.",
            "items": {
              "$ref": "#/components/schemas/CellFeedbackTargetSchema"
            },
            "maxItems": 1000,
            "minItems": 1,
            "title": "Cells",
            "type": "array"
          },
          "comment": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What was wrong, in the user's own words. Applied to every named cell. Optional.",
            "title": "Comment"
          },
          "rating": {
            "$ref": "#/components/schemas/CellFeedbackRating"
          }
        },
        "required": [
          "cells",
          "rating"
        ],
        "title": "CellFeedbackBulkRequestSchema",
        "type": "object"
      },
      "CellFeedbackBulkResponseSchema": {
        "description": "Result of a bulk rating; cells that could not be rated are counted.\n\nNo echo of the stored verdicts: the caller already knows the one rating and\none note it sent, so returning a thousand identical copies would say\nnothing it could not derive. ``skipped_column_ids`` is the part it cannot.",
        "properties": {
          "applied": {
            "description": "Cells whose verdict was written.",
            "title": "Applied",
            "type": "integer"
          },
          "skipped": {
            "description": "Cells refused because no agent writes their column.",
            "title": "Skipped",
            "type": "integer"
          },
          "skipped_column_ids": {
            "description": "The distinct columns that refused, so the client can name them.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Skipped Column Ids",
            "type": "array"
          },
          "updated": {
            "description": "Cells whose verdict was written; the same as applied.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "applied",
          "skipped"
        ],
        "title": "CellFeedbackBulkResponseSchema",
        "type": "object"
      },
      "CellFeedbackRating": {
        "description": "How a person judged one produced cell value.",
        "enum": [
          "up",
          "down"
        ],
        "title": "CellFeedbackRating",
        "type": "string"
      },
      "CellFeedbackRequestSchema": {
        "description": "One person's verdict on one produced cell value.",
        "properties": {
          "comment": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What was wrong, in the user's own words. Optional.",
            "title": "Comment"
          },
          "rating": {
            "$ref": "#/components/schemas/CellFeedbackRating"
          }
        },
        "required": [
          "rating"
        ],
        "title": "CellFeedbackRequestSchema",
        "type": "object"
      },
      "CellFeedbackResponseSchema": {
        "description": "The current user's verdict on one cell, if they gave one.",
        "properties": {
          "feedback": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CellFeedbackSchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "feedback"
        ],
        "title": "CellFeedbackResponseSchema",
        "type": "object"
      },
      "CellFeedbackSchema": {
        "description": "A stored verdict on one cell.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "comment": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Comment"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "rating": {
            "$ref": "#/components/schemas/CellFeedbackRating"
          },
          "row_id": {
            "format": "uuid",
            "title": "Row Id",
            "type": "string"
          },
          "saved_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Saved Agent Id"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "column_id",
          "row_id",
          "rating",
          "comment",
          "saved_agent_id",
          "created_at",
          "updated_at"
        ],
        "title": "CellFeedbackSchema",
        "type": "object"
      },
      "CellFeedbackTargetSchema": {
        "description": "One cell named by a bulk rating.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          }
        },
        "required": [
          "record_id",
          "column_id"
        ],
        "title": "CellFeedbackTargetSchema",
        "type": "object"
      },
      "CellSettlementSchema": {
        "description": "One column's cells, split by how their last attempt ended.\n\nFILLED IS NOT COMPLETE, and reading them as the same number is the bug this\nshape exists to end. ``filled`` is a storage fact: the cell holds a value.\n``complete`` is a work fact: the last attempt reached a verdict, nothing has\ninvalidated it since, and no stopped run still owes a recompute. They\ndiverge in both directions. An enrichment that ran cleanly and found nothing\nis complete and empty, which on an AI column is the ordinary case; a cell\nholding last week's value under an edited formula is filled and incomplete.\n\nEvery figure counts only cells that HAVE a stored row. A cell nothing has\never attempted has no row at all, so a column's outstanding work is\n``row_count`` minus ``complete``, not a number reported here.",
        "properties": {
          "cancelled": {
            "description": "Cells holding a fresh answer that a stopped run was to recompute and never did, so they are not complete. Stale and pending cells are not counted here: they are already out of date or not run yet.",
            "title": "Cancelled",
            "type": "integer"
          },
          "complete": {
            "description": "Cells with nothing owed on them: a terminal verdict, still fresh, and not awaiting a recompute a stopped run never delivered. Excludes failures, which a retry can still fill.",
            "title": "Complete",
            "type": "integer"
          },
          "failed": {
            "description": "Cells that ran and errored. Retryable, so not complete.",
            "title": "Failed",
            "type": "integer"
          },
          "filled": {
            "description": "Cells holding a value in some typed slot.",
            "title": "Filled",
            "type": "integer"
          },
          "no_data": {
            "description": "Cells that ran cleanly and produced nothing. A definitive answer about this row rather than an incident. Free for a lookup; an AI column's cell is charged what it used.",
            "title": "No Data",
            "type": "integer"
          },
          "skipped": {
            "description": "Cells deliberately held back: a required input was empty, or the run condition was false.",
            "title": "Skipped",
            "type": "integer"
          },
          "sources_unavailable": {
            "default": 0,
            "description": "The failed cells an enrichment left while some of its sources were unavailable. Counted inside `failed` too. Run failed rows waits on them until every source the column uses is back.",
            "title": "Sources Unavailable",
            "type": "integer"
          },
          "stale": {
            "description": "Cells whose inputs changed after they were computed. Cuts across the other counts: a stale cell still shows its old value.",
            "title": "Stale",
            "type": "integer"
          },
          "succeeded": {
            "description": "Cells that ran and produced a value.",
            "title": "Succeeded",
            "type": "integer"
          },
          "waiting": {
            "default": 0,
            "description": "Pending cells whose work was handed to a sender's LinkedIn browser, which fills them when it answers. Not complete, and under way.",
            "title": "Waiting",
            "type": "integer"
          }
        },
        "required": [
          "filled",
          "complete",
          "succeeded",
          "no_data",
          "skipped",
          "failed",
          "stale",
          "cancelled"
        ],
        "title": "CellSettlementSchema",
        "type": "object"
      },
      "CellValue-Input": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "integer"
          },
          {
            "type": "number"
          },
          {
            "type": "boolean"
          },
          {
            "format": "date-time",
            "type": "string"
          },
          {
            "format": "date",
            "type": "string"
          },
          {
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/CellValue-Input"
                },
                {
                  "type": "null"
                }
              ]
            },
            "type": "array"
          },
          {
            "additionalProperties": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/CellValue-Input"
                },
                {
                  "type": "null"
                }
              ]
            },
            "type": "object"
          }
        ]
      },
      "CellValue-Output": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "integer"
          },
          {
            "type": "number"
          },
          {
            "type": "boolean"
          },
          {
            "format": "date-time",
            "type": "string"
          },
          {
            "format": "date",
            "type": "string"
          },
          {
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/CellValue-Output"
                },
                {
                  "type": "null"
                }
              ]
            },
            "type": "array"
          },
          {
            "additionalProperties": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/CellValue-Output"
                },
                {
                  "type": "null"
                }
              ]
            },
            "type": "object"
          }
        ]
      },
      "ChangeKind": {
        "description": "What one change of a feedback session does to the learnings (F2).",
        "enum": [
          "add",
          "update",
          "delete",
          "keep",
          "instruction",
          "link",
          "fact"
        ],
        "title": "ChangeKind",
        "type": "string"
      },
      "ChangeOutcome": {
        "description": "What saving a session did with one of its changes (F2).",
        "enum": [
          "applied",
          "skipped_full",
          "skipped_changed",
          "pending",
          "undo_pending",
          "undone",
          "left",
          "left_out"
        ],
        "title": "ChangeOutcome",
        "type": "string"
      },
      "ChangeVersionReadSchema": {
        "description": "How a session's change read before a later note rewrote it.",
        "properties": {
          "find": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "An instruction edit's words it replaced.",
            "title": "Find"
          },
          "note": {
            "description": "The note that made this version.",
            "title": "Note",
            "type": "integer"
          },
          "replace_with": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the instruction edit put in their place.",
            "title": "Replace With"
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning, link or fact's answer as it read.",
            "title": "Text"
          }
        },
        "required": [
          "note",
          "text",
          "find",
          "replace_with"
        ],
        "title": "ChangeVersionReadSchema",
        "type": "object"
      },
      "ChatAttachmentColumnValueReadSchema": {
        "description": "One cell of an attached file's column, as the file spells it.",
        "properties": {
          "number": {
            "description": "The data row the cell is in, counted from 1 under the header, in file order.",
            "title": "Number",
            "type": "integer"
          },
          "value": {
            "description": "The raw value, not coerced.",
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "number",
          "value"
        ],
        "title": "ChatAttachmentColumnValueReadSchema",
        "type": "object"
      },
      "ChatAttachmentCommentReadSchema": {
        "description": "One cell comment of a workbook, as whoever made the file left it.",
        "properties": {
          "cell": {
            "description": "The cell it sits on, as the workbook names it: `B12`.",
            "title": "Cell",
            "type": "string"
          },
          "row_subject": {
            "description": "The first value of the row it sits on, so the comment keeps what it is about.",
            "title": "Row Subject",
            "type": "string"
          },
          "text": {
            "description": "What it says. File content, as the rows are.",
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "cell",
          "text",
          "row_subject"
        ],
        "title": "ChatAttachmentCommentReadSchema",
        "type": "object"
      },
      "ChatAttachmentImportRequestSchema": {
        "description": "Build a table out of an attached file.",
        "properties": {
          "header_row": {
            "default": 0,
            "description": "For a file whose first row is a title: the row that holds the column names, numbered as a page of the file's rows numbers them (1 is the first row under the title). The table's columns are named from it and only the rows below it are added. 0 keeps the first row as the header.",
            "minimum": 0.0,
            "title": "Header Row",
            "type": "integer"
          },
          "name": {
            "description": "What to call the table. Unique in the workspace.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "row_ranges": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/ImportRowRangeSchema"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only these rows, the way a print dialog picks pages, numbered as a page of the file's rows numbers them and as `header_row` is: 1 is the row at offset 0, the first under the file's first row, and every row holding any text counts, a row of placeholders like N/A included. So with `header_row` 2 the rows under the column names start at 3. A row the table gets no value from (only placeholders, or the column names and the rows above them) is left out. At most 100 ranges once merged. Omit for every row.",
            "title": "Row Ranges"
          }
        },
        "required": [
          "name"
        ],
        "title": "ChatAttachmentImportRequestSchema",
        "type": "object"
      },
      "ChatAttachmentImportResponseSchema": {
        "description": "The table an attached file is becoming.\n\nThe table exists when this returns; its rows are still arriving, loaded\nin the background from the file's own rows. ``row_count`` is how many\nwill land, which is the file's count clamped to the row ceiling, and the\nfile's own count stands beside it so a caller can say when the two differ\nrather than pass the smaller number off as the whole file.",
        "properties": {
          "column_count": {
            "title": "Column Count",
            "type": "integer"
          },
          "file_row_count": {
            "description": "Rows in the file, as its attachment card counts them, less the header row named and the rows above it.",
            "title": "File Row Count",
            "type": "integer"
          },
          "import_id": {
            "description": "The import job loading the rows, for polling.",
            "format": "uuid",
            "title": "Import Id",
            "type": "string"
          },
          "limited_by": {
            "anyOf": [
              {
                "enum": [
                  "plan",
                  "deployment"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whose ceiling it was: the plan's, which a bigger plan raises, or the deployment's, which none does. Null when nothing was cut.",
            "title": "Limited By"
          },
          "row_count": {
            "description": "Rows that will be added: the rows chosen, or the file's from the top.",
            "title": "Row Count",
            "type": "integer"
          },
          "row_limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The ceiling that cut the file short, or null when every row is being added.",
            "title": "Row Limit"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "import_id",
          "row_count",
          "file_row_count",
          "row_limit",
          "limited_by",
          "column_count"
        ],
        "title": "ChatAttachmentImportResponseSchema",
        "type": "object"
      },
      "ChatAttachmentPageReadSchema": {
        "description": "One page of a PDF, as text.\n\nLaid out as the page prints it, so a table's rows stay one line each, with\nevery gap between columns cut to three spaces. The PDF's own page count is\non its read, ``GET /chat-attachments/{attachment_id}/``.",
        "properties": {
          "number": {
            "description": "The page's number, counted from 1.",
            "title": "Number",
            "type": "integer"
          },
          "text": {
            "description": "The page's text, laid out as the page prints it. A page with no text is empty, and a page whose text could not be read says so.",
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "number",
          "text"
        ],
        "title": "ChatAttachmentPageReadSchema",
        "type": "object"
      },
      "ChatAttachmentReadSchema": {
        "description": "One file attached to a chat message, as the card above the message draws it.\n\nThe bytes are never returned; the shape is. ``columns`` and ``row_count``\nare what a card and a model's first look need, and a page of rows is a\nseparate read.",
        "properties": {
          "column_count": {
            "title": "Column Count",
            "type": "integer"
          },
          "columns": {
            "description": "The header row's names, in order; empty for a PDF.",
            "items": {
              "type": "string"
            },
            "title": "Columns",
            "type": "array"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "filename": {
            "title": "Filename",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/WorkspaceChatAttachmentKind",
            "description": "What the file is: `spreadsheet` for a CSV or an Excel sheet, `pdf` for a PDF."
          },
          "page_count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "A PDF's pages; null for a spreadsheet.",
            "title": "Page Count"
          },
          "row_count": {
            "description": "Data rows under the header row; 0 for a PDF, whose table is read into rows only when its rows are first read.",
            "title": "Row Count",
            "type": "integer"
          },
          "sent": {
            "description": "Whether the file has been sent with a message. A file added and never sent can be removed; one already sent stays with its message.",
            "title": "Sent",
            "type": "boolean"
          },
          "sheet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The workbook sheet the rows were read from; null for a CSV or a PDF.",
            "title": "Sheet"
          },
          "size_bytes": {
            "title": "Size Bytes",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "filename",
          "kind",
          "size_bytes",
          "row_count",
          "column_count",
          "columns",
          "sheet",
          "page_count",
          "sent",
          "created_at"
        ],
        "title": "ChatAttachmentReadSchema",
        "type": "object"
      },
      "ChatAttachmentRowReadSchema": {
        "description": "One row of a file, as text, with the cell comments on it.\n\nWhat the sheet the row comes from says about itself (its column names, its\nwhole row count, its sheets) is ``GET \u2026/rows/length/``.",
        "properties": {
          "cells": {
            "description": "One cell per column of the sheet, in the order `GET \u2026/rows/length/` names the columns, clipped to what a page keeps.",
            "items": {
              "type": "string"
            },
            "title": "Cells",
            "type": "array"
          },
          "comments": {
            "description": "The cell comments on this row, in the file's order; empty for a CSV.",
            "items": {
              "$ref": "#/components/schemas/ChatAttachmentCommentReadSchema"
            },
            "title": "Comments",
            "type": "array"
          },
          "comments_unread": {
            "description": "Whether this row may have comments the read could not reach; the sheet's `comment_notes` say why.",
            "title": "Comments Unread",
            "type": "boolean"
          },
          "number": {
            "description": "The row's number, counted from 1 under the header.",
            "title": "Number",
            "type": "integer"
          },
          "shortened": {
            "description": "Whether a cell of this row was too long to read whole and was cut to fit.",
            "title": "Shortened",
            "type": "boolean"
          }
        },
        "required": [
          "number",
          "cells",
          "comments",
          "shortened",
          "comments_unread"
        ],
        "title": "ChatAttachmentRowReadSchema",
        "type": "object"
      },
      "ChatAttachmentRowsCountSchema": {
        "description": "How many rows a file's sheet has, with what the sheet says about itself.\n\nThe count of the rows ``GET \u2026/rows/`` pages through, read the same way, and\nwhat a reader needs to read those rows: their column names, the sheet they\ncome from and the workbook's others, whether the header is only a title,\nand what reading the sheet had to do. The comments on no data row are a\nlist of their own, ``GET \u2026/comments/``: a count holds values, never\nrecords.",
        "properties": {
          "columns": {
            "description": "The header row's names for the sheet read, one per cell of each row.",
            "items": {
              "type": "string"
            },
            "title": "Columns",
            "type": "array"
          },
          "comment_notes": {
            "description": "Why some of the sheet's cell comments could not be read: true of the rows whose `comments_unread` is true.",
            "items": {
              "type": "string"
            },
            "title": "Comment Notes",
            "type": "array"
          },
          "count": {
            "description": "Data rows in the whole sheet read.",
            "title": "Count",
            "type": "integer"
          },
          "header_is_title": {
            "description": "Whether the first row is a one-cell title over a wider table, so the column names, if any, are in one of the rows below; the import and the column read take that row's number as `header_row`.",
            "title": "Header Is Title",
            "type": "boolean"
          },
          "notes": {
            "description": "Sentences about what reading the sheet had to do.",
            "items": {
              "type": "string"
            },
            "title": "Notes",
            "type": "array"
          },
          "sheet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The workbook sheet read; null for a CSV or a PDF.",
            "title": "Sheet"
          },
          "sheet_names": {
            "description": "Every visible sheet of the workbook, in tab order; empty for a CSV or a PDF.",
            "items": {
              "type": "string"
            },
            "title": "Sheet Names",
            "type": "array"
          }
        },
        "required": [
          "count",
          "columns",
          "sheet",
          "sheet_names",
          "header_is_title",
          "notes",
          "comment_notes"
        ],
        "title": "ChatAttachmentRowsCountSchema",
        "type": "object"
      },
      "CheckConnectionsOutcome": {
        "additionalProperties": false,
        "description": "One reading of our own connections list, newest connection first.\n\n``rows`` are what the browser reported; the server keeps them on the\nreading's own log row and strips them from here before the action settles,\nso this document ends up with the counts only (``rows_read``,\n``rows_unread``) and nobody's key outlives its retention on a step's row.\n\n``member_urn`` echoes the salt every key was hashed with\n(``CheckConnectionsParams.member_urn``); a reading salted for any member\nbut the account's proves nothing. ``sort_proven`` says the list was shown\n\"Recently added\" by a token that cannot be a position or a word; a reading\nthat cannot prove it is never judged, though the members it lists are\nstill matched. ``stable`` says two snapshots taken apart agreed. ``empty``\nis LinkedIn's own empty-list surface. ``pages`` counts the batches read\n(one, plus each \"Show more\"), ``more_available`` whether LinkedIn offered\nanother, ``reached_watermark`` whether the reading got back to the last\none's rows. ``named_by`` says which spellings rows carried, which decides\nwhich ledger rows a reading can match at all.",
        "properties": {
          "complete": {
            "default": false,
            "title": "Complete",
            "type": "boolean"
          },
          "empty": {
            "default": false,
            "title": "Empty",
            "type": "boolean"
          },
          "kind": {
            "const": "check_connections",
            "default": "check_connections",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "maxLength": 128,
            "title": "Member Urn",
            "type": "string"
          },
          "more_available": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "More Available"
          },
          "named_by": {
            "items": {
              "enum": [
                "vanity",
                "member",
                "fsd_profile"
              ],
              "type": "string"
            },
            "maxItems": 3,
            "title": "Named By",
            "type": "array"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "pages": {
            "default": 0,
            "maximum": 6.0,
            "minimum": 0.0,
            "title": "Pages",
            "type": "integer"
          },
          "reached_watermark": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reached Watermark"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "rows": {
            "items": {
              "$ref": "#/components/schemas/LinkedInConnectionRow"
            },
            "maxItems": 400,
            "title": "Rows",
            "type": "array"
          },
          "rows_read": {
            "anyOf": [
              {
                "maximum": 400.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rows Read"
          },
          "rows_unread": {
            "anyOf": [
              {
                "maximum": 400.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rows Unread"
          },
          "sort_proven": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sort Proven"
          },
          "stable": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Stable"
          }
        },
        "required": [
          "member_urn"
        ],
        "title": "CheckConnectionsOutcome",
        "type": "object"
      },
      "CheckConnectionsParams": {
        "additionalProperties": false,
        "description": "Housekeeping: read the newest rows of our own connections list.\n\n``member_urn`` is the account's member as the server holds it: the exact\nstring the browser salts every row key with, and echoes on the outcome.\n``watermark_keys`` are the keys of the rows the last reading saw, newest\nfirst, so the browser knows how far back \"Show more\" needs to go; it may\npress it at most ``max_more`` times. Both are empty and zero on a first\nreading, which is then judged on its first batch alone, and the keys are\nsent only while \"Show more\" may be pressed at all.",
        "properties": {
          "kind": {
            "const": "check_connections",
            "default": "check_connections",
            "title": "Kind",
            "type": "string"
          },
          "max_more": {
            "default": 0,
            "maximum": 5.0,
            "minimum": 0.0,
            "title": "Max More",
            "type": "integer"
          },
          "member_urn": {
            "maxLength": 128,
            "title": "Member Urn",
            "type": "string"
          },
          "watermark_keys": {
            "items": {
              "pattern": "^[0-9a-f]{32}$",
              "type": "string"
            },
            "maxItems": 400,
            "title": "Watermark Keys",
            "type": "array"
          }
        },
        "required": [
          "member_urn"
        ],
        "title": "CheckConnectionsParams",
        "type": "object"
      },
      "CheckInboxOutcome": {
        "additionalProperties": false,
        "description": "One reading of the conversation list.\n\nRows the scan could not name are why a reading is not ``complete``.",
        "properties": {
          "complete": {
            "default": false,
            "title": "Complete",
            "type": "boolean"
          },
          "conversations": {
            "items": {
              "$ref": "#/components/schemas/LinkedInConversationRow"
            },
            "maxItems": 500,
            "title": "Conversations",
            "type": "array"
          },
          "kind": {
            "const": "check_inbox",
            "default": "check_inbox",
            "title": "Kind",
            "type": "string"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "title": "CheckInboxOutcome",
        "type": "object"
      },
      "CheckInboxParams": {
        "additionalProperties": false,
        "description": "Housekeeping: scan the conversation list for new inbound activity. Takes nothing.",
        "properties": {
          "kind": {
            "const": "check_inbox",
            "default": "check_inbox",
            "title": "Kind",
            "type": "string"
          }
        },
        "title": "CheckInboxParams",
        "type": "object"
      },
      "CheckSentInvitationsOutcome": {
        "additionalProperties": false,
        "description": "One reading of the sent-invitations list, as the members still outstanding.\n\nA list with no rows is only ``complete`` when LinkedIn's own empty-list\nsurface was seen, because the list loading is the action here and a list\nthat never rendered is an honest failure. Every urn the reading omits is\nmarked disappeared, a state that does not recover on the next reading, so\na reading with a row it could not name is reported and never complete.\n\nThe list LinkedIn renders now names each member only by the ``/in/<slug>``\nof their profile link, and draws the newest rows first with the rest\nloading on scroll, which a background tab never does: ``newest_only`` is\nsuch a reading, the top of the list and not all of it, and is judged only\nas far down as it reaches (see ``sql_repository.apply_sweep``).",
        "properties": {
          "complete": {
            "default": false,
            "title": "Complete",
            "type": "boolean"
          },
          "kind": {
            "const": "check_sent_invitations",
            "default": "check_sent_invitations",
            "title": "Kind",
            "type": "string"
          },
          "newest_only": {
            "default": false,
            "title": "Newest Only",
            "type": "boolean"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "still_pending_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 2000,
            "title": "Still Pending Urns",
            "type": "array"
          },
          "still_pending_vanities": {
            "items": {
              "maxLength": 200,
              "type": "string"
            },
            "maxItems": 2000,
            "title": "Still Pending Vanities",
            "type": "array"
          }
        },
        "title": "CheckSentInvitationsOutcome",
        "type": "object"
      },
      "CheckSentInvitationsParams": {
        "additionalProperties": false,
        "description": "Housekeeping: read our own sent-invitations list. Takes nothing.",
        "properties": {
          "kind": {
            "const": "check_sent_invitations",
            "default": "check_sent_invitations",
            "title": "Kind",
            "type": "string"
          }
        },
        "title": "CheckSentInvitationsParams",
        "type": "object"
      },
      "ColumnCreditRateSchema": {
        "description": "One paid column's price for one row: the most it can cost, and what it usually costs.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "credits_per_row": {
            "description": "The most one row of this column can cost.",
            "title": "Credits Per Row",
            "type": "number"
          },
          "usual_credits_per_row": {
            "description": "What one row usually costs, from what the same kind of cell has been charged before. With no history yet, a typical share of credits_per_row for a column charged by use, and credits_per_row for a flat price.",
            "title": "Usual Credits Per Row",
            "type": "number"
          }
        },
        "required": [
          "column_id",
          "credits_per_row",
          "usual_credits_per_row"
        ],
        "title": "ColumnCreditRateSchema",
        "type": "object"
      },
      "ColumnMappingSchema": {
        "description": "Which audience columns carry a meaning, all detected from the table.\n\nOne field per channel (email, LinkedIn) plus the company domain the\ncoverage line reports on. Leave the whole object out when binding an\naudience and the columns are detected server-side. Send it only to correct\na detection: a first name, a company or a last-contacted date is no longer\npart of this, because every column on the table is already addressable as a\n`{{Column name}}` variable.",
        "properties": {
          "company_domain_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The account identity, reported on by the audience coverage counts. Unmapped, the coverage count is zero.",
            "title": "Company Domain Column Id"
          },
          "email_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the send address is read from, and the deduplication key: two rows sharing an address are one contact.",
            "title": "Email Column Id"
          },
          "email_deliverability_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column holding each address's deliverability verdict, usually the Verify email column over the email column; detected when the table has one. Read only while an email column is mapped, and dropped without one. An address is emailed only when its verdict is one of `email_deliverability_results`; any other verdict skips the email step (LinkedIn steps still run), and an address not verified yet waits for its verdict. Unmapped, every address is emailed unverified.",
            "title": "Email Deliverability Column Id"
          },
          "email_deliverability_results": {
            "description": "The verdicts the sequence emails: valid, catch-all, risky, unknown, invalid or disposable. Valid alone by default; an empty list reads as the default. An answer the column could not give counts as unknown.",
            "items": {
              "$ref": "#/components/schemas/EmailDeliverability"
            },
            "maxItems": 6,
            "title": "Email Deliverability Results",
            "type": "array"
          },
          "linkedin_url_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Required by LinkedIn steps; a row without one skips them.",
            "title": "Linkedin Url Column Id"
          }
        },
        "title": "ColumnMappingSchema",
        "type": "object"
      },
      "ColumnMappingUpdateSchema": {
        "properties": {
          "mapping": {
            "$ref": "#/components/schemas/ColumnMappingSchema"
          }
        },
        "required": [
          "mapping"
        ],
        "title": "ColumnMappingUpdateSchema",
        "type": "object"
      },
      "ColumnRef": {
        "description": "A parameter that reads another column's cell value on the same row.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "ref": {
            "const": "column",
            "default": "column",
            "title": "Ref",
            "type": "string"
          }
        },
        "required": [
          "column_id"
        ],
        "title": "ColumnRef",
        "type": "object"
      },
      "ColumnRunEstimateSchema": {
        "description": "One column a run would work on, in the order it runs, and what its part costs.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "credits_at_most": {
            "description": "The most this column's part of the run can cost, in credits.",
            "title": "Credits At Most",
            "type": "number"
          },
          "credits_usually": {
            "description": "What this column's part usually costs, in credits, from what the same kind of cell has been charged before, or a typical share of credits_at_most while there is no history yet. Equal to credits_at_most for a flat price.",
            "title": "Credits Usually",
            "type": "number"
          },
          "display_name": {
            "description": "The column's name, as the table shows it.",
            "title": "Display Name",
            "type": "string"
          }
        },
        "required": [
          "column_id",
          "display_name",
          "credits_at_most",
          "credits_usually"
        ],
        "title": "ColumnRunEstimateSchema",
        "type": "object"
      },
      "ColumnTemplateApplyResponseSchema": {
        "description": "What an apply created, or on a dry run would create.",
        "properties": {
          "created_column_names": {
            "description": "The new columns' names, in template order. A name the table already had carries a number after it.",
            "items": {
              "type": "string"
            },
            "title": "Created Column Names",
            "type": "array"
          }
        },
        "required": [
          "created_column_names"
        ],
        "title": "ColumnTemplateApplyResponseSchema",
        "type": "object"
      },
      "ColumnTemplateApplySchema": {
        "description": "Replay a template onto a table.",
        "properties": {
          "position": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Insert position of the FIRST column; the rest follow it contiguously, in template order. Appended when omitted.",
            "title": "Position"
          },
          "table_id": {
            "description": "The table to create the columns on.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id"
        ],
        "title": "ColumnTemplateApplySchema",
        "type": "object"
      },
      "ColumnTemplateCreateSchema": {
        "description": "Capture a selection of a table's columns as a named template.",
        "properties": {
          "column_ids": {
            "description": "The columns to capture; stored in display order.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "title": "Column Ids",
            "type": "array"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "table_id": {
            "description": "The table the columns live on.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "name",
          "table_id",
          "column_ids"
        ],
        "title": "ColumnTemplateCreateSchema",
        "type": "object"
      },
      "ColumnTemplateReadSchema": {
        "description": "One template as the picker lists it.",
        "properties": {
          "column_count": {
            "description": "How many columns the bundle holds.",
            "title": "Column Count",
            "type": "integer"
          },
          "column_names": {
            "description": "The columns the template creates, in order.",
            "items": {
              "type": "string"
            },
            "title": "Column Names",
            "type": "array"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "column_count",
          "column_names",
          "created_at"
        ],
        "title": "ColumnTemplateReadSchema",
        "type": "object"
      },
      "CompanyEmployeesViewOutcome": {
        "additionalProperties": false,
        "description": "What a People tab search read.\n\n``people`` is everyone read, deduplicated by profile, at most the step's\n``max_people``; its length is what the step is charged for\n(``priced_units``). ``complete`` is False when a search's list stopped\ndrawing before it ran out or reached the step's limit. Kept on the row:\nat most 25 short cards, and the step's caller saves them as rows anyway.",
        "properties": {
          "company_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Resolved"
          },
          "company_slug": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Slug"
          },
          "complete": {
            "default": false,
            "title": "Complete",
            "type": "boolean"
          },
          "kind": {
            "const": "company_employees_view",
            "default": "company_employees_view",
            "title": "Kind",
            "type": "string"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "people": {
            "items": {
              "$ref": "#/components/schemas/LinkedInCompanyPerson"
            },
            "maxItems": 25,
            "title": "People",
            "type": "array"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "title": "CompanyEmployeesViewOutcome",
        "type": "object"
      },
      "CompanyEmployeesViewParams": {
        "additionalProperties": false,
        "description": "Open a company page's People tab, search it for each keyword, and read who it lists.\n\n``keywords`` are role words (\"head of sales\", \"revenue operations\"), each\nsearched on its own; the people read across them are deduplicated by\nprofile and stop at ``max_people``. No keywords reads the tab as LinkedIn\nfirst draws it.",
        "properties": {
          "company_url": {
            "maxLength": 512,
            "title": "Company Url",
            "type": "string"
          },
          "keywords": {
            "items": {
              "maxLength": 60,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 5,
            "title": "Keywords",
            "type": "array"
          },
          "kind": {
            "const": "company_employees_view",
            "default": "company_employees_view",
            "title": "Kind",
            "type": "string"
          },
          "max_people": {
            "default": 10,
            "maximum": 25.0,
            "minimum": 1.0,
            "title": "Max People",
            "type": "integer"
          }
        },
        "required": [
          "company_url"
        ],
        "title": "CompanyEmployeesViewParams",
        "type": "object"
      },
      "CompanyMapState": {
        "description": "Where a company's map on LinkedIn stands, as the Account page shows it.",
        "enum": [
          "starting",
          "waiting",
          "running",
          "done",
          "failed",
          "stopped"
        ],
        "title": "CompanyMapState",
        "type": "string"
      },
      "CompanyMapStep": {
        "description": "The LinkedIn step a company's map is on, as the Account page shows it.",
        "enum": [
          "company_page",
          "people_search"
        ],
        "title": "CompanyMapStep",
        "type": "string"
      },
      "CompanyMatchCheckSchema": {
        "description": "How many of the column's companies the people search has people at.",
        "properties": {
          "checked": {
            "description": "How many of the column's companies were counted. Fewer than `companies` when the check ran out of time; asking again carries on.",
            "title": "Checked",
            "type": "integer"
          },
          "role": {
            "$ref": "#/components/schemas/EmployerRole",
            "description": "Which job was counted: `current` (held now) or `past` (one that ended)."
          },
          "unmatched": {
            "description": "The first 100 of those companies, in row order.",
            "items": {
              "$ref": "#/components/schemas/UnmatchedCompanySchema"
            },
            "title": "Unmatched",
            "type": "array"
          },
          "unmatched_count": {
            "description": "How many counted companies no one in the people search works at, even matched by the domain the search files them under. A search following the column finds nobody there.",
            "title": "Unmatched Count",
            "type": "integer"
          }
        },
        "required": [
          "role",
          "checked",
          "unmatched_count",
          "unmatched"
        ],
        "title": "CompanyMatchCheckSchema",
        "type": "object"
      },
      "CompanyNameSuggestionSchema": {
        "description": "A company of the same name that the people search does have people at.",
        "properties": {
          "name": {
            "description": "The company's name, as the table spells it.",
            "title": "Name",
            "type": "string"
          },
          "people": {
            "description": "How many people the people search holds at the company of that exact name, in the job the check counted (held now, or one that ended).",
            "title": "People",
            "type": "integer"
          }
        },
        "required": [
          "name",
          "people"
        ],
        "title": "CompanyNameSuggestionSchema",
        "type": "object"
      },
      "CompanyPostWindow": {
        "description": "How recently a company posted on the professional network, as a company search asks it.",
        "enum": [
          "past_week",
          "past_month",
          "past_quarter",
          "past_year"
        ],
        "title": "CompanyPostWindow",
        "type": "string"
      },
      "CompanyProfileViewOutcome": {
        "additionalProperties": false,
        "description": "What a company page view saw.\n\n``company_resolved`` and ``company_slug`` come from where the browser\nlanded, as a profile view's ``profile_resolved`` and ``vanity`` do: False\nand ``company_not_resolved`` when LinkedIn has no page there. ``company``\nis the page's facts, None when the page drew none readable. Kept on the\nrow: a company's public facts, small, and what the caller saves.",
        "properties": {
          "company": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInCompanyContent"
              },
              {
                "type": "null"
              }
            ]
          },
          "company_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Resolved"
          },
          "company_slug": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Slug"
          },
          "kind": {
            "const": "company_profile_view",
            "default": "company_profile_view",
            "title": "Kind",
            "type": "string"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "title": "CompanyProfileViewOutcome",
        "type": "object"
      },
      "CompanyProfileViewParams": {
        "additionalProperties": false,
        "description": "Open a company's LinkedIn page and read its facts.",
        "properties": {
          "company_url": {
            "maxLength": 512,
            "title": "Company Url",
            "type": "string"
          },
          "kind": {
            "const": "company_profile_view",
            "default": "company_profile_view",
            "title": "Kind",
            "type": "string"
          }
        },
        "required": [
          "company_url"
        ],
        "title": "CompanyProfileViewParams",
        "type": "object"
      },
      "CompanyQuerySchema": {
        "description": "Filters for a company search.",
        "properties": {
          "category": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the site says the company does, read by the search rather than declared."
          },
          "cities": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Headquarters cities."
          },
          "company_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's type, one of: Privately Held, Public Company, Self-Employed, Self-Owned, Partnership, Nonprofit, Educational or Government Agency. Matched case-insensitively; any other value is refused rather than quietly matching nothing."
          },
          "countries": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Headquarters countries, written out in full."
          },
          "department_headcount": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TeamHeadcountFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many employees work in one department, for example at least 10 in Engineering and Technical. Reaches about half the companies. The team to count is one of: Administrative, Consulting, Customer Service, Design, Education, Engineering and Technical, Finance & Accounting, General Management, Human Resources, Legal, Marketing, Medical, Operations, Other, Product, Project Management, Real Estate, Research, Sales or Trades."
          },
          "domain": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's website domain, as stripe.com."
          },
          "enriched_keywords": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the company offers, products and services, as read off its site."
          },
          "exclude_expired_domains": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Excludes companies whose website domain has expired."
          },
          "executive_joined_within": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ExecutiveChangeWindow"
              },
              {
                "type": "null"
              }
            ],
            "description": "Companies where an executive joined inside this window: past_month, past_quarter or past_year."
          },
          "executive_left_within": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ExecutiveChangeWindow"
              },
              {
                "type": "null"
              }
            ],
            "description": "Companies where an executive left inside this window: past_month, past_quarter or past_year."
          },
          "executive_titles": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Narrows the executive changes above to these roles, for example Chief Revenue Officer. On its own, matches a company where someone joined in one of these roles."
          },
          "followers": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many followers the company's professional profile has."
          },
          "founded": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The year the company was founded."
          },
          "funding_round_types": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The type of the last round raised, for example Seed or Series A. Funding coverage is thin, so this narrows hard."
          },
          "funding_rounds_count": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many funding rounds the company has raised in all."
          },
          "has_api_docs": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company publishes API documentation."
          },
          "has_demo": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company offers a demo."
          },
          "has_free_trial": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company offers a free trial."
          },
          "has_mobile_apps": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company has mobile apps."
          },
          "has_online_reviews": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company has reviews on review sites."
          },
          "has_pricing_page": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company's website has a pricing page."
          },
          "has_website": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company has a website."
          },
          "headcount": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's employee count."
          },
          "headcount_growth": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GrowthFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Headcount change as a percentage band, over the past month (1month), 3 months (3months) or 12 months (12months). The 6- and 24-month windows are refused."
          },
          "identifier": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Specific companies, as domains, LinkedIn company URLs, LinkedIn vanity names or numeric LinkedIn ids, mixed freely."
          },
          "industry": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's industry, from the lead database's fixed industry list. Matched case-insensitively; a value outside the list is refused and the nearest entry is named."
          },
          "is_b2b": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company sells to businesses, by the index's own reading."
          },
          "is_downloadable": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company offers software to download and install."
          },
          "is_saas": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the company sells software as a service."
          },
          "keyword": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words in the company's description."
          },
          "last_funding_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies whose last round closed on or after this day, as YYYY-MM-DD.",
            "title": "Last Funding After"
          },
          "last_funding_amount": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The size of the last round raised, in US dollars. Rounds reported in another currency are left out."
          },
          "last_funding_before": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies whose last round closed on or before this day, as YYYY-MM-DD.",
            "title": "Last Funding Before"
          },
          "linkedin_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's numeric LinkedIn id."
          },
          "linkedin_slug": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's LinkedIn vanity name, as in acme-inc."
          },
          "location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the company's headquarters are. A country may be written as its name or its alpha-2 code; both are sent as the code. A comma narrows a city to its country, as in Paris, France; several values are alternatives."
          },
          "name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's name, the brand it goes by."
          },
          "office_cities": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cities the company has any office in, not just its headquarters."
          },
          "office_countries": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Countries the company has any office in, not just its headquarters."
          },
          "office_states": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "States or provinces the company has any office in, not just its headquarters."
          },
          "post_keyword": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words in the company's posts on the professional network, within posted_within."
          },
          "post_reactions": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many reactions one of the company's posts drew."
          },
          "posted_within": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyPostWindow"
              },
              {
                "type": "null"
              }
            ],
            "description": "Companies that posted on the professional network inside this window: past_week, past_month, past_quarter or past_year."
          },
          "revenue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Annual revenue in US dollars. A company matches when any of its revenue estimates falls inside the range. Only about one company in thirteen carries an estimate, so this narrows hard."
          },
          "seniority_headcount": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TeamHeadcountFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many employees sit at one seniority, for example at least 3 Directors. Reaches about half the companies. The team to count is one of: C-Level, Director, Founder, Head, Intern, Manager, Owner, Partner, President/Vice President, Senior, Specialist or Vice President."
          },
          "size_bands": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Headcount as a band, one of: Myself Only, 1-10 employees, 11-50 employees, 51-200 employees, 201-500 employees, 501-1000 employees, 1001-5000 employees, 5001-10,000 employees or 10,001+ employees. Offered beside the numeric headcount, not instead of it."
          },
          "social_networks": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Companies with a profile on any of these networks: facebook, instagram, youtube, x, twitter, tiktok, reddit, pinterest, github or discord. Matched case-insensitively; any other value is refused."
          },
          "specialities": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Categories and keywords filed on the company's profile."
          },
          "states": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Headquarters states or provinces, written out in full."
          },
          "technologies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Technologies the company's website runs. Reaches only the companies whose site has been read, about one in six, so expect a smaller result than other filters give."
          },
          "technology_first_seen_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only count a technology FIRST seen on or after this day, as YYYY-MM-DD.",
            "title": "Technology First Seen After"
          },
          "technology_verified_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only count a technology still seen on or after this day, as YYYY-MM-DD.",
            "title": "Technology Verified After"
          },
          "unique_domain_only": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Excludes companies sharing a domain, which collapse into one row."
          }
        },
        "title": "CompanyQuerySchema",
        "type": "object"
      },
      "CompanyStatus": {
        "description": "A directory company's standing, where the directory says (Y Combinator).",
        "enum": [
          "active",
          "acquired",
          "inactive",
          "public"
        ],
        "title": "CompanyStatus",
        "type": "string"
      },
      "CompanyTableFilterSchema": {
        "description": "The companies a search follows from a table, and the ones it leaves out.",
        "properties": {
          "exclude": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyTableLinkSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Leave out people whose employer is in this column."
          },
          "include": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyTableLinkSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only people whose employer is in this column."
          }
        },
        "title": "CompanyTableFilterSchema",
        "type": "object"
      },
      "CompanyTableLinkSchema": {
        "description": "One column of one of your tables, read as a list of companies.",
        "properties": {
          "column_id": {
            "description": "The column with each company's website, web address, LinkedIn company page or numeric LinkedIn id. A column of company names matches no one.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "table_id": {
            "description": "The table holding the companies.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A saved view of that table: only the rows its filter keeps are read. Omit it to read every row.",
            "title": "View Id"
          }
        },
        "required": [
          "table_id",
          "column_id"
        ],
        "title": "CompanyTableLinkSchema",
        "type": "object"
      },
      "CompanyTableResponseSchema": {
        "description": "What a table column holds right now, read the way a people search following it reads it.",
        "properties": {
          "column_name": {
            "description": "The column's name.",
            "title": "Column Name",
            "type": "string"
          },
          "companies": {
            "description": "How many distinct companies the column holds now: websites, web addresses, LinkedIn company pages and ids, each counted once.",
            "title": "Companies",
            "type": "integer"
          },
          "examples": {
            "description": "The first few of those companies, in row order.",
            "items": {
              "type": "string"
            },
            "title": "Examples",
            "type": "array"
          },
          "folder_names": {
            "description": "The folders the table sits in, from the top level down; empty at the top level. Said before the table's name, so a table in a folder never reads as one at the top level.",
            "items": {
              "type": "string"
            },
            "title": "Folder Names",
            "type": "array"
          },
          "matches": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyMatchCheckSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which companies no one in the people search works at, when `check_role` asked for it. Null otherwise, and for a column with no companies or more than a search can follow."
          },
          "names_skipped": {
            "description": "How many distinct values are not a company's website or LinkedIn page, such as company names or people's LinkedIn profiles. A search cannot match them, so it leaves them out.",
            "title": "Names Skipped",
            "type": "integer"
          },
          "table_name": {
            "description": "The table's name.",
            "title": "Table Name",
            "type": "string"
          },
          "too_many": {
            "description": "Whether the column holds more companies than one search can follow (5,000). A search following it is refused until a view narrows it.",
            "title": "Too Many",
            "type": "boolean"
          },
          "view_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The saved view whose rows are read, or null when every row is.",
            "title": "View Name"
          }
        },
        "required": [
          "table_name",
          "folder_names",
          "column_name",
          "view_name",
          "companies",
          "examples",
          "names_skipped",
          "too_many"
        ],
        "title": "CompanyTableResponseSchema",
        "type": "object"
      },
      "CompanyType": {
        "description": "How a company makes money: the catalog's ``company_type`` choices, one for one.",
        "enum": [
          "b2b_saas",
          "b2c_saas",
          "agency_services",
          "ecommerce_dtc",
          "marketplace",
          "manufacturing",
          "financial_services",
          "healthcare",
          "education",
          "nonprofit",
          "government",
          "media_publishing",
          "real_estate",
          "hospitality",
          "logistics",
          "other"
        ],
        "title": "CompanyType",
        "type": "string"
      },
      "ConnectInputKind": {
        "description": "The kind of a connect-time input the connect modal renders.",
        "enum": [
          "tenant",
          "choice",
          "region"
        ],
        "title": "ConnectInputKind",
        "type": "string"
      },
      "ConnectInputOptionSchema": {
        "description": "One selectable option of a choice/region connect input.",
        "properties": {
          "label": {
            "title": "Label",
            "type": "string"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value",
          "label"
        ],
        "title": "ConnectInputOptionSchema",
        "type": "object"
      },
      "ConnectInputSchema": {
        "description": "A single connect-time input the connect modal renders.",
        "properties": {
          "default": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default"
          },
          "helper": {
            "title": "Helper",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ConnectInputKind",
            "description": "tenant (free text), choice (options), or region (dropdown)."
          },
          "label": {
            "title": "Label",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "options": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/ConnectInputOptionSchema"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Options"
          },
          "placeholder": {
            "title": "Placeholder",
            "type": "string"
          },
          "required": {
            "title": "Required",
            "type": "boolean"
          }
        },
        "required": [
          "kind",
          "name",
          "label",
          "placeholder",
          "helper",
          "required"
        ],
        "title": "ConnectInputSchema",
        "type": "object"
      },
      "ConnectionRecordTypeReadSchema": {
        "description": "One record type a connection holds, and which of its fields can be listed.",
        "properties": {
          "can_list_builtin_properties": {
            "description": "Whether the tool can list this record type's builtin fields. When false, GET /integrations/{integration_id}/properties/?kind=builtin answers none: the tool exposes no catalog of them, not that it has none.",
            "title": "Can List Builtin Properties",
            "type": "boolean"
          },
          "can_list_custom_properties": {
            "description": "Whether the tool can list this record type's custom fields. When false, GET /integrations/{integration_id}/properties/?kind=custom answers none.",
            "title": "Can List Custom Properties",
            "type": "boolean"
          },
          "custom": {
            "description": "False for a record type the tool always has (Stripe's 'customer'); true for one created on the tool's side and discovered through its API (an Attio custom object, a database table).",
            "title": "Custom",
            "type": "boolean"
          },
          "name": {
            "description": "The record type's name in the tool, e.g. 'customer'.",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "name",
          "custom",
          "can_list_builtin_properties",
          "can_list_custom_properties"
        ],
        "title": "ConnectionRecordTypeReadSchema",
        "type": "object"
      },
      "ConnectionRequestOutcome": {
        "additionalProperties": false,
        "description": "What sending an invitation produced: the common fields and the nine profile facts.\n\nThe facts are read twice: before pressing Connect, which is what decides\nwhether there is anything to send, and again after the invitation window\nclosed, which is the verification. An invitation that went out shows as\n``invitation_pending`` on re-reading; a re-reading that shows Connect back\non offer is a failure, whatever the window did.\n\n``member_urn`` is the load-bearing field: without it the invitation ledger\nrow never opens and acceptance detection has nothing to match. Whether a\nnote went with the invitation is the step's own ``note``: the browser\nsends exactly what it was handed or fails rather than send less, and how\nfar a failed attempt got is the row's error message. The one exception is\n``sent_without_note``: True when LinkedIn sent the invitation the moment\nConnect was pressed, with no window to write the note in. The invitation\nexists, so the step succeeded; the note it was handed did not go with it.\nNone whenever the note went (or there was none to send). Not ``note_sent``:\nthat key was retired, and the release task strips it from stored rows.",
        "properties": {
          "already_connected": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Connected"
          },
          "already_following": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Following"
          },
          "can_send_message": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Can Send Message"
          },
          "found_already": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInFoundAlready"
              },
              {
                "type": "null"
              }
            ]
          },
          "invitation_pending": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invitation Pending"
          },
          "kind": {
            "const": "connection_request",
            "default": "connection_request",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "member_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 8,
            "title": "Member Urns",
            "type": "array"
          },
          "open_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open Profile"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "profile_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Resolved"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "sent_without_note": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sent Without Note"
          },
          "vanity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity"
          }
        },
        "title": "ConnectionRequestOutcome",
        "type": "object"
      },
      "ConnectionRequestParams": {
        "additionalProperties": false,
        "description": "Send an invitation, with or without a note.\n\n``profile_url`` is where the browser goes first. ``note`` is what the\nbrowser types, already clipped to LinkedIn's ceiling on a word boundary.\n``note_original_length`` is how long the rendered note was before clipping,\nthe one number nothing can recover once the text is gone, so history can\nsay who lost text and how much. Whether it was cut follows from the two and\nis not stored beside them.",
        "properties": {
          "kind": {
            "const": "connection_request",
            "default": "connection_request",
            "title": "Kind",
            "type": "string"
          },
          "note": {
            "default": "",
            "maxLength": 300,
            "title": "Note",
            "type": "string"
          },
          "note_original_length": {
            "default": 0,
            "minimum": 0.0,
            "title": "Note Original Length",
            "type": "integer"
          },
          "profile_url": {
            "maxLength": 512,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "profile_url"
        ],
        "title": "ConnectionRequestParams",
        "type": "object"
      },
      "ContactBrowserOutcomeReadSchema": {
        "description": "The outcome a contact's latest settled Browser use run took, as the run settled on it.",
        "properties": {
          "broke_off": {
            "default": false,
            "description": "True when the run broke off on its own (a time limit, credits, the page) rather than the agent choosing Needs human; only ever with needs_human.",
            "title": "Broke Off",
            "type": "boolean"
          },
          "finished_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the run settled.",
            "title": "Finished At"
          },
          "key": {
            "$ref": "#/components/schemas/SequenceEdgeBranch",
            "description": "The branch it settled on: outcome_1 to outcome_8, or needs_human."
          },
          "label": {
            "description": "The outcome's label as the run settled on it, kept through a later rename or removal of the outcome; 'Needs human' for needs_human.",
            "title": "Label",
            "type": "string"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the run ended there, in a sentence; null when unsaid.",
            "title": "Reason"
          },
          "step_id": {
            "description": "The Browser use step the run was of.",
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          }
        },
        "required": [
          "step_id",
          "key",
          "label"
        ],
        "title": "ContactBrowserOutcomeReadSchema",
        "type": "object"
      },
      "ContactFieldReadSchema": {
        "description": "One filled column of the contact's audience row: its header and its text.",
        "properties": {
          "name": {
            "title": "Name",
            "type": "string"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "name",
          "value"
        ],
        "title": "ContactFieldReadSchema",
        "type": "object"
      },
      "ContactGroup": {
        "description": "The Audience tab's tab a contact sits under; every contact is under one.\n\nThe tabs used to be counts that overlapped (a bounced contact was both\n\"reachable\" and \"blocked\", so the counts added up past the roster) and\nopened a list of names over the roster they repeated (Natsuki,\n2026-10-02). They partition the roster now and filter it in place, so a\ntab's count is exactly the rows it shows, and each row's own status chip\nnames the state that put it there.\n\nDerived at read time from the status, the stop reason, the contact's\ncurrent-step task and whether an address reaches them, never stored.",
        "enum": [
          "in_progress",
          "needs_approval",
          "paused",
          "done",
          "blocked",
          "removed"
        ],
        "title": "ContactGroup",
        "type": "string"
      },
      "ContactGroupCountsReadSchema": {
        "description": "How many contacts sit under each of the Audience tab's tabs; they add up to ``checked``.",
        "properties": {
          "blocked": {
            "description": "Cannot go on: no address reaches them, do not contact, in another sequence, contacted too recently, bounced, their mailbox removed, or a step that stopped on an error.",
            "title": "Blocked",
            "type": "integer"
          },
          "done": {
            "description": "Nothing left to do: finished, replied, unsubscribed or stopped, or found already connected by a Withdraw.",
            "title": "Done",
            "type": "integer"
          },
          "in_progress": {
            "description": "Still in the cadence; a draft's roster, which the tab names Not started.",
            "title": "In Progress",
            "type": "integer"
          },
          "needs_approval": {
            "description": "A message waiting on the customer's approval.",
            "title": "Needs Approval",
            "type": "integer"
          },
          "paused": {
            "description": "Paused by hand, or in the cadence of a paused sequence.",
            "title": "Paused",
            "type": "integer"
          },
          "removed": {
            "description": "No longer in the audience: removed by hand, or their row deleted from the table or out of the view. The All tab counts everyone but these.",
            "title": "Removed",
            "type": "integer"
          }
        },
        "required": [
          "in_progress",
          "needs_approval",
          "paused",
          "done",
          "blocked",
          "removed"
        ],
        "title": "ContactGroupCountsReadSchema",
        "type": "object"
      },
      "ContactHistoryEntryReadSchema": {
        "description": "One thing this sequence did to one contact.",
        "properties": {
          "at": {
            "format": "date-time",
            "title": "At",
            "type": "string"
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The email's words as they were sent, without the signature and opt-out footer the send added below them (`email_html` has the whole email), or the text of the contact's reply (trimmed, and cut short past about a thousand characters).",
            "title": "Body"
          },
          "browser_run": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BrowserRunReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A Browser use step's run, on its entry. Null on every other entry."
          },
          "decided_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Decided At"
          },
          "decided_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who decided, as a name. Null when nobody was asked, or when the channel recorded a decision without saying who made it.",
            "title": "Decided By Display Name"
          },
          "decision": {
            "anyOf": [
              {
                "enum": [
                  "approved",
                  "rejected"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a person decided about this step from the approval queue, if asked.",
            "title": "Decision"
          },
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The email's subject, the LinkedIn message, or nothing.",
            "title": "Detail"
          },
          "email_html": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "An email's HTML part exactly as it was handed to Gmail: the words, the sender's signature and the opt-out footer, every line, blank line and space as the contact got them. Null for a send from before the send kept its email, and on every entry that is not an email.",
            "title": "Email Html"
          },
          "entered_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the contact reached this step, as distinct from when it ran. The gap between the two is the step's wait.",
            "title": "Entered At"
          },
          "kind": {
            "$ref": "#/components/schemas/ContactHistoryKind"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "One plain sentence to show under the outcome where it needs saying, such as which address cannot receive email on a bounce.",
            "title": "Note"
          },
          "outcome": {
            "description": "accepted/failed for a send, or bounced on the email a bounce came back for; the action's own status for LinkedIn; skipped for an email or LinkedIn step the contact was moved past without it being done, with note saying why; yes/no for a condition, and the branch taken (connected, already_connected, not_accepted) for a connection request's answer; replied for the contact's reply; for a Browser use step, queued or running while its run is under way, then the branch it took (an outcome slot, or needs_human).",
            "title": "Outcome",
            "type": "string"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InviteOutcome"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a connection request's decision: why the contact took that branch (accepted, already_connected, expired, declined, or why no request could go out). note carries it as a sentence. Null on every other entry."
          },
          "spam_signals": {
            "description": "What the spam check said about this message as it went out, one sentence per finding. Empty when it raised nothing. A finding never held the send back; it is here so a reply that never came has an explanation to read.",
            "items": {
              "type": "string"
            },
            "title": "Spam Signals",
            "type": "array"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Id"
          },
          "step_name": {
            "title": "Step Name",
            "type": "string"
          },
          "step_position": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step's customer-visible ordinal, zero-based.",
            "title": "Step Position"
          },
          "thread_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The inbox conversation this entry opens, on the reply entry. Null when the contact has no conversation in the inbox.",
            "title": "Thread Id"
          }
        },
        "required": [
          "at",
          "kind",
          "step_name",
          "outcome"
        ],
        "title": "ContactHistoryEntryReadSchema",
        "type": "object"
      },
      "ContactHistoryKind": {
        "description": "What one entry in a contact's history is.",
        "enum": [
          "email",
          "linkedin",
          "condition",
          "reply",
          "browser"
        ],
        "title": "ContactHistoryKind",
        "type": "string"
      },
      "ContactOrderBy": {
        "description": "The orders the Audience tab lists a sequence's contacts in.",
        "enum": [
          "created_at",
          "due_at",
          "status"
        ],
        "title": "ContactOrderBy",
        "type": "string"
      },
      "ContactReviewVerdict": {
        "description": "What a person said about one contact's whole thread.\n\nBAD is no longer given here (Agent Learnings, 2026-10-20): Needs work is a thumbs down,\nwhich saves a learning and writes the thread again with no verdict on it. It stays for\nthe sessions saved with one.",
        "enum": [
          "good",
          "bad",
          "skipped"
        ],
        "title": "ContactReviewVerdict",
        "type": "string"
      },
      "ContactSamplesCreateSchema": {
        "description": "What writing one contact's samples takes: whether to write them again, and as whom.",
        "properties": {
          "fresh": {
            "default": false,
            "description": "Write this contact's emails again rather than answer the sample already saved, as when someone asks for them to be written again. Words marked Looks good, and a person's own words, still stand.",
            "title": "Fresh",
            "type": "boolean"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The mailbox whose sender's name, title and booking link fill the sender variables; left out, the sequence's first sender's, the sender a sample is written as.",
            "title": "Mailbox Id"
          }
        },
        "title": "ContactSamplesCreateSchema",
        "type": "object"
      },
      "ContactSelectionSchema": {
        "description": "Which contacts a bulk action on the Audience tab reaches.\n\nSend ``ids`` for contacts picked one by one. Send ``all: true`` for every\ncontact the filters below match (every contact, with none), less any\n``excluded_ids``, resolved on the server at the moment of the action so it\ncovers every match across pages. A body that names nobody is refused.",
        "properties": {
          "all": {
            "default": false,
            "description": "Act on every contact the filters match, or every contact when there are none. Required when ids is absent.",
            "title": "All",
            "type": "boolean"
          },
          "created_from": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only contacts added on or after this instant. The grid's date range, which an action on everything matching has to honour or it reaches past what the person was looking at.",
            "title": "Created From"
          },
          "created_to": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created To"
          },
          "exclude": {
            "default": false,
            "description": "Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.",
            "title": "Exclude",
            "type": "boolean"
          },
          "excluded_ids": {
            "description": "With all, contacts to leave out: the rows unticked after ticking the header.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 1000,
            "title": "Excluded Ids",
            "type": "array"
          },
          "group": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContactGroup"
              },
              {
                "type": "null"
              }
            ],
            "description": "The Audience tab's tab the grid was showing. An action on everything matching reaches only the contacts under it, or Select all under one tab would act on everyone."
          },
          "ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contacts to act on, by enrolment id.",
            "title": "Ids"
          },
          "order_by": {
            "$ref": "#/components/schemas/ContactOrderBy",
            "default": "created_at",
            "description": "The order the grid was listing in. Under a 'group', the action judges the same contacts the tab's list judged in that order."
          },
          "order_direction": {
            "default": "desc",
            "description": "The direction of order_by.",
            "enum": [
              "asc",
              "desc"
            ],
            "title": "Order Direction",
            "type": "string"
          },
          "outcomes": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/SequenceEdgeBranch"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only contacts whose latest settled Browser use run took one of these outcomes: the grid's Outcome filter.",
            "title": "Outcomes"
          },
          "search": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Search"
          },
          "statuses": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/EnrolmentStatus"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Statuses"
          },
          "stop_reasons": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/StopReason"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Stop Reasons"
          }
        },
        "title": "ContactSelectionSchema",
        "type": "object"
      },
      "ContactTrainingStatus": {
        "description": "A session's phase, also used to resume its review screen.",
        "enum": [
          "running",
          "reviewing",
          "proposing",
          "proposed",
          "completed",
          "abandoned"
        ],
        "title": "ContactTrainingStatus",
        "type": "string"
      },
      "ContactsBreakdownReadSchema": {
        "description": "Added, in progress and finished, with every non-send cause visible.",
        "properties": {
          "added": {
            "title": "Added",
            "type": "integer"
          },
          "awaiting_action": {
            "default": 0,
            "description": "Parked behind a task waiting on a person or a channel: an approval or a LinkedIn browser.",
            "title": "Awaiting Action",
            "type": "integer"
          },
          "cooldown": {
            "default": 0,
            "description": "Stopped by the workspace's cooldown: reached by someone else recently.",
            "title": "Cooldown",
            "type": "integer"
          },
          "cooldown_running": {
            "default": 0,
            "description": "Of cooldown, the contacts whose cooldown is still running: another sequence reached them within the workspace's cooldown days as set now. Counted within cooldown, not beside it.",
            "title": "Cooldown Running",
            "type": "integer"
          },
          "failed": {
            "title": "Failed",
            "type": "integer"
          },
          "failed_retryable": {
            "default": 0,
            "description": "The failed contacts Retry can do something for: every failure but a Withdraw that found the person already connected. Counted within failed, not beside it; what Retry all re-queues.",
            "title": "Failed Retryable",
            "type": "integer"
          },
          "finished": {
            "title": "Finished",
            "type": "integer"
          },
          "in_progress": {
            "title": "In Progress",
            "type": "integer"
          },
          "not_started": {
            "default": 0,
            "description": "A draft's roster: contacts in the sequence and waiting on its launch (status pending). Not counted in in_progress.",
            "title": "Not Started",
            "type": "integer"
          },
          "out_of_office": {
            "default": 0,
            "description": "Contacts 'Resume out-of-office' would bring back right now. Counted within the statuses above as well, not beside them.",
            "title": "Out Of Office",
            "type": "integer"
          },
          "paused": {
            "title": "Paused",
            "type": "integer"
          },
          "skipped_duplicate": {
            "title": "Skipped Duplicate",
            "type": "integer"
          },
          "stopped": {
            "title": "Stopped",
            "type": "integer"
          },
          "suppressed": {
            "title": "Suppressed",
            "type": "integer"
          }
        },
        "required": [
          "added",
          "in_progress",
          "paused",
          "finished",
          "failed",
          "stopped",
          "suppressed",
          "skipped_duplicate"
        ],
        "title": "ContactsBreakdownReadSchema",
        "type": "object"
      },
      "ContactsPerGroupReadSchema": {
        "description": "How the contacts a roster filter matches split across the Audience tab's tabs.",
        "properties": {
          "capped": {
            "description": "More contacts match than one read judges, so each tab's count is at least that many.",
            "title": "Capped",
            "type": "boolean"
          },
          "count": {
            "description": "Every contact the filters match, the Removed tab's included. The All tab counts this less groups.removed.",
            "title": "Count",
            "type": "integer"
          },
          "groups": {
            "$ref": "#/components/schemas/ContactGroupCountsReadSchema",
            "description": "How many of the matching contacts sit under each tab. Each one sits under exactly one, and list_sequence_contacts' 'group' with the same filters lists them."
          }
        },
        "required": [
          "count",
          "capped",
          "groups"
        ],
        "title": "ContactsPerGroupReadSchema",
        "type": "object"
      },
      "ContentFilterSchema": {
        "description": "A text filter over the words a signal was drawn from, capped at 20 terms each way.",
        "properties": {
          "exclude": {
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Exclude",
            "type": "array"
          },
          "include": {
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Include",
            "type": "array"
          }
        },
        "title": "ContentFilterSchema",
        "type": "object"
      },
      "ConversationGrantsReadSchema": {
        "description": "What one conversation may apply without asking: the list, and where it comes from.\n\nRead for the shield in the chat header. ``follows_defaults`` tells the\nheader whether to show the list as the workspace's (change it in\nSettings) or as this thread's own (take one back here, or return to the\ndefaults). ``granted_tools`` is what the shield lists: the AI Assistant's\ncards are decided by tool, and the verbs decide only an agent's.",
        "properties": {
          "follows_defaults": {
            "description": "Whether the list is the workspace defaults, read live. False once the conversation has a list of its own, which a change in Settings no longer reaches.",
            "title": "Follows Defaults",
            "type": "boolean"
          },
          "granted_tools": {
            "description": "The write operations the AI Assistant runs without asking in this conversation, in effect now: operation names as `GET /assistant/tools/` lists them, and `family:<area>` for the rest of one part of the product. Approving a card for this conversation adds its operation here. Only what still allows something is listed, by the name its operation has today.",
            "items": {
              "type": "string"
            },
            "title": "Granted Tools",
            "type": "array"
          },
          "granted_verbs": {
            "description": "The verbs this conversation applies without asking, in effect now.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceVerb"
            },
            "title": "Granted Verbs",
            "type": "array"
          }
        },
        "required": [
          "granted_verbs",
          "granted_tools",
          "follows_defaults"
        ],
        "title": "ConversationGrantsReadSchema",
        "type": "object"
      },
      "ConversationGrantsUpdateSchema": {
        "description": "Change a conversation's grant list, or hand it back to the workspace defaults.\n\nThe verbs and the operations are two halves of one list, and a field left\nout keeps its half exactly as it was.",
        "properties": {
          "granted_tools": {
            "anyOf": [
              {
                "items": {
                  "maxLength": 255,
                  "minLength": 1,
                  "type": "string"
                },
                "maxItems": 200,
                "type": "array"
              },
              {}
            ],
            "description": "The write operations the AI Assistant may run without asking in this conversation. Send the current list minus one to take it back; an empty list allows none. A verb's name is ignored here.",
            "title": "Granted Tools"
          },
          "granted_verbs": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/WorkspaceVerb"
                },
                "maxItems": 8,
                "type": "array"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The verbs this conversation may apply without asking. Send the current list minus one verb to take that verb back. Send null to follow the workspace defaults again, operations included; an empty list allows nothing. A send is refused.",
            "title": "Granted Verbs"
          }
        },
        "title": "ConversationGrantsUpdateSchema",
        "type": "object"
      },
      "CooldownSettingsReadSchema": {
        "properties": {
          "is_suggested": {
            "description": "True when this is the suggested value for a workspace with no saved rule.",
            "title": "Is Suggested",
            "type": "boolean"
          },
          "person_cooldown_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Days during which a contacted person is not contacted again. Null is off.",
            "title": "Person Cooldown Days"
          },
          "suggestion_pending": {
            "description": "True when the one-time suggested-default prompt has not been resolved.",
            "title": "Suggestion Pending",
            "type": "boolean"
          }
        },
        "required": [
          "person_cooldown_days",
          "is_suggested",
          "suggestion_pending"
        ],
        "title": "CooldownSettingsReadSchema",
        "type": "object"
      },
      "CooldownSettingsUpdateSchema": {
        "properties": {
          "dismiss_suggestion": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Mark the one-time suggested-default prompt as resolved.",
            "title": "Dismiss Suggestion"
          },
          "person_cooldown_days": {
            "anyOf": [
              {
                "maximum": 365.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Person Cooldown Days"
          }
        },
        "title": "CooldownSettingsUpdateSchema",
        "type": "object"
      },
      "CreateTableFromLeadSearchRequestSchema": {
        "description": "A search plus a new table to put its results in.",
        "properties": {
          "backlinks": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinksQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "enrichments": {
            "description": "What to find out about the rows this search adds. Optional on a paid finder. Find People and Find Companies require at least one. Each becomes its own column, and each is billed per row that comes back with an answer.",
            "items": {
              "$ref": "#/components/schemas/LeadEnrichmentOption"
            },
            "maxItems": 4,
            "title": "Enrichments",
            "type": "array"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder to make the new table in, as when the search was started from inside one on the Tables list. Leave it out for the top level, or, for a people search that reads its companies from a table, that table's folder.",
            "title": "Folder Id"
          },
          "hiring_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HiringCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "include_people_already_in_tables": {
            "default": false,
            "description": "A people search only. By default it leaves out the people who already have a row in one of the workspace's other tables, and keeps looking until enough new people are added; the response says how many it skipped. Set true to add them again.",
            "title": "Include People Already In Tables",
            "type": "boolean"
          },
          "local_businesses": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LocalBusinessQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "lookalikes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LookalikeQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "post_authors": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PostAuthorsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "row_limit": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rows to add. Clamped further by the organisation's plan cap; omit for the maximum.",
            "title": "Row Limit"
          },
          "search_results": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SearchResultsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalPeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "startup_launches": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StartupLaunchesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "table_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The new table's name. Omit it and the table is named after the search, the name `POST /leads/table-name/suggestions/` gives.",
            "title": "Table Name"
          }
        },
        "required": [
          "record_type"
        ],
        "title": "CreateTableFromLeadSearchRequestSchema",
        "type": "object"
      },
      "CreateTableFromLeadSearchResponseSchema": {
        "description": "The table a search produced.",
        "properties": {
          "column_notes": {
            "description": "What the search did to the table's columns beyond its rows, one sentence each, to show beside the result: a column it made that links each person to their company's row in the table the search follows. Empty when it made none.",
            "items": {
              "type": "string"
            },
            "title": "Column Notes",
            "type": "array"
          },
          "earlier_table": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EarlierLeadTableSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A table the same search (the same filters) already built, when it still exists."
          },
          "enrichments_applied": {
            "description": "Chosen enrichments that became a column on the new table.",
            "items": {
              "$ref": "#/components/schemas/LeadEnrichmentOption"
            },
            "title": "Enrichments Applied",
            "type": "array"
          },
          "enrichments_skipped": {
            "description": "Chosen enrichments that could not run against the records this search returned. Leads with no LinkedIn URL cannot be enriched from one. The table is still created.",
            "items": {
              "$ref": "#/components/schemas/LeadEnrichmentOption"
            },
            "title": "Enrichments Skipped",
            "type": "array"
          },
          "import_status": {
            "$ref": "#/components/schemas/LeadSearchRunStatus",
            "default": "success",
            "description": "`running` when the request added a first batch and the rest is still being added in the background, so poll the table's search runs for progress; `success` when every row is in."
          },
          "people_skipped": {
            "default": 0,
            "description": "People the request left out because another of the workspace's tables already has them. A run that continues in the background goes on skipping them.",
            "title": "People Skipped",
            "type": "integer"
          },
          "provider_notices": {
            "description": "What the data source said about the rows it sold, in its own words; see the preview response. Empty for every data source that attaches nothing.",
            "items": {
              "type": "string"
            },
            "title": "Provider Notices",
            "type": "array"
          },
          "rows_created": {
            "title": "Rows Created",
            "type": "integer"
          },
          "rows_not_added": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RowsNotAddedSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The people the search found that are not rows, and why, once every row is in: `found_twice` when the people search holds one person under two records, so a new table took them once; `already_in_table` when a person found was already a row of the table. Null when every person found was added, or while rows are still being added."
          },
          "rows_wanted": {
            "default": 0,
            "description": "Rows the import set out to add in all: never more than `total_matched` where the data source counts its matches.",
            "title": "Rows Wanted",
            "type": "integer"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The run row recording this import, when the search is persisted.",
            "title": "Run Id"
          },
          "skip_limit_reached": {
            "default": false,
            "description": "Whether the search stopped looking after skipping as many people as one search may, so fewer rows may be added than asked for.",
            "title": "Skip Limit Reached",
            "type": "boolean"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          },
          "table_run_request_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The request for the table run that fills the new table's columns, when every row was added by this request: the run is minted with it as its origin. Null while rows are still being added in the background, where each batch fills its own.",
            "title": "Table Run Request Id"
          },
          "total_matched": {
            "title": "Total Matched",
            "type": "integer"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "rows_created",
          "total_matched"
        ],
        "title": "CreateTableFromLeadSearchResponseSchema",
        "type": "object"
      },
      "CreateTableFromSourceRequestSchema": {
        "description": "What to import, and into a table called what.",
        "properties": {
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder to make the table in, as when the import starts from inside one on the Tables list. Leave it out for the top level.",
            "title": "Folder Id"
          },
          "identity_field": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which id key to match rows on, one of the preview's identity_field_choices. Null takes the preview's recommended identity_field. A key some records lack, or one records share, is refused.",
            "title": "Identity Field"
          },
          "integration_id": {
            "description": "The connected integration to import from.",
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          },
          "promote_paths": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Fields to give their own column, in this order. Null uses the preview's suggestions; an empty list promotes nothing. Unknown paths are skipped; the table's column limit is the only ceiling.",
            "title": "Promote Paths"
          },
          "record_type": {
            "description": "Which object to import.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Record Type",
            "type": "string"
          },
          "row_limit": {
            "anyOf": [
              {
                "exclusiveMinimum": 0.0,
                "maximum": 2147483647.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Most rows one run may pull; null for everything. A limited source can never sweep deletions: it cannot tell a record it chose not to fetch from one that is gone.",
            "title": "Row Limit"
          },
          "table_name": {
            "description": "Name for the new table.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "integration_id",
          "record_type",
          "table_name"
        ],
        "title": "CreateTableFromSourceRequestSchema",
        "type": "object"
      },
      "CreateTableFromSubdomainSearchRequestSchema": {
        "description": "Turn a finished search into a table.",
        "properties": {
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder to make the table in, as when the search is started from inside one on the Tables list. Leave it out for the top level.",
            "title": "Folder Id"
          },
          "table_name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_name"
        ],
        "title": "CreateTableFromSubdomainSearchRequestSchema",
        "type": "object"
      },
      "CreateTableFromSubdomainSearchResponseSchema": {
        "description": "The table a search was turned into.",
        "properties": {
          "hostnames_found": {
            "description": "What the search found, before any cap. Larger than rows_created when the per-search cap trimmed what was stored or the organisation's per-table row limit clamped the landing.",
            "title": "Hostnames Found",
            "type": "integer"
          },
          "rows_created": {
            "title": "Rows Created",
            "type": "integer"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "rows_created",
          "hostnames_found"
        ],
        "title": "CreateTableFromSubdomainSearchResponseSchema",
        "type": "object"
      },
      "CreateTableScheduleRequestSchema": {
        "description": "Set up a table's refresh cadence.",
        "properties": {
          "delete_missing_rows": {
            "default": false,
            "description": "Delete rows whose records have gone from the source. Forces every scheduled run to re-list everything, and is capped per run so a provider outage cannot empty the table.",
            "title": "Delete Missing Rows",
            "type": "boolean"
          },
          "frequency": {
            "$ref": "#/components/schemas/TableScheduleFrequency",
            "description": "A preset, or 'custom' for an interval."
          },
          "hour": {
            "default": 9,
            "description": "Local hour to run at.",
            "maximum": 23.0,
            "minimum": 0.0,
            "title": "Hour",
            "type": "integer"
          },
          "interval_unit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableScheduleIntervalUnit"
              },
              {
                "type": "null"
              }
            ],
            "description": "Required for a custom cadence."
          },
          "interval_value": {
            "anyOf": [
              {
                "exclusiveMinimum": 0.0,
                "maximum": 365.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Required for a custom cadence.",
            "title": "Interval Value"
          },
          "minute": {
            "default": 0,
            "description": "Local minute to run at.",
            "maximum": 59.0,
            "minimum": 0.0,
            "title": "Minute",
            "type": "integer"
          },
          "time_zone": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "IANA zone the time is in; defaults to UTC. An unknown zone falls back to UTC.",
            "title": "Time Zone"
          }
        },
        "required": [
          "frequency"
        ],
        "title": "CreateTableScheduleRequestSchema",
        "type": "object"
      },
      "CreditAttributionCountSchema": {
        "description": "How many tables or agents spent in a window, with the window's totals.",
        "properties": {
          "count": {
            "description": "Entities in the window: every row the attribution list pages through, the unattributed one included.",
            "title": "Count",
            "type": "integer"
          },
          "subentity_breakdown_since": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Drill-down rows cover only the detailed window when the range crosses the rollup boundary.",
            "title": "Subentity Breakdown Since"
          },
          "total_credits_refunded": {
            "description": "The organization refunded total row, in decimal credits.",
            "title": "Total Credits Refunded",
            "type": "number"
          },
          "total_credits_spent": {
            "description": "The organization total row, net of refunds, in decimal credits.",
            "title": "Total Credits Spent",
            "type": "number"
          },
          "unattributed_credits": {
            "description": "Spend no table or agent is named for, in decimal credits.",
            "title": "Unattributed Credits",
            "type": "number"
          }
        },
        "required": [
          "count",
          "unattributed_credits",
          "total_credits_spent",
          "total_credits_refunded",
          "subentity_breakdown_since"
        ],
        "title": "CreditAttributionCountSchema",
        "type": "object"
      },
      "CreditAttributionEntitySchema": {
        "description": "One attribution entity (table or provider) with its drill-down rows.",
        "properties": {
          "avg_cost_per_unit": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Avg Cost Per Unit"
          },
          "credits_refunded": {
            "description": "Refunded portion, reported separately, in decimal credits.",
            "title": "Credits Refunded",
            "type": "number"
          },
          "credits_spent": {
            "description": "Net of any refunds sharing this attribution, in decimal credits.",
            "title": "Credits Spent",
            "type": "number"
          },
          "deleted": {
            "default": false,
            "description": "True when a table id no longer resolves to a live table. The row is kept so the credits stay accounted for, but the client must render the name as plain text rather than a link to a table that is gone.",
            "title": "Deleted",
            "type": "boolean"
          },
          "entry_count": {
            "title": "Entry Count",
            "type": "integer"
          },
          "id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Table id for table grouping; null otherwise.",
            "title": "Id"
          },
          "key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Provider key for provider grouping; null otherwise.",
            "title": "Key"
          },
          "name": {
            "description": "Resolved display name.",
            "title": "Name",
            "type": "string"
          },
          "subentities": {
            "description": "Drill-down rows sorted by credits descending.",
            "items": {
              "$ref": "#/components/schemas/CreditAttributionSubentitySchema"
            },
            "title": "Subentities",
            "type": "array"
          },
          "units": {
            "title": "Units",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "key",
          "name",
          "credits_spent",
          "credits_refunded",
          "units",
          "entry_count",
          "avg_cost_per_unit",
          "subentities"
        ],
        "title": "CreditAttributionEntitySchema",
        "type": "object"
      },
      "CreditAttributionResponseSchema": {
        "description": "Credit spend attributed to providers and accounts: the by-provider report.\n\nThe table and agent attributions are built the same way, then answered as a page of\ntheir entities (``GET /credits/usage/by-table/``, ``GET /credits/usage/by-agent/``)\nbeside a count holding the window's totals, since their entities grow with the\nworkspace's tables and agents; the CSV export still writes all of them.",
        "properties": {
          "entities": {
            "description": "Sorted by credits descending; includes an explicit unattributed entity.",
            "items": {
              "$ref": "#/components/schemas/CreditAttributionEntitySchema"
            },
            "title": "Entities",
            "type": "array"
          },
          "subentity_breakdown_since": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Drill-down rows cover only the detailed window when the range crosses the rollup boundary.",
            "title": "Subentity Breakdown Since"
          },
          "total_credits_refunded": {
            "description": "The organization refunded total row, in decimal credits.",
            "title": "Total Credits Refunded",
            "type": "number"
          },
          "total_credits_spent": {
            "description": "The organization total row, net of refunds, in decimal credits.",
            "title": "Total Credits Spent",
            "type": "number"
          },
          "unattributed_credits": {
            "description": "In decimal credits.",
            "title": "Unattributed Credits",
            "type": "number"
          }
        },
        "required": [
          "entities",
          "unattributed_credits",
          "total_credits_spent",
          "total_credits_refunded",
          "subentity_breakdown_since"
        ],
        "title": "CreditAttributionResponseSchema",
        "type": "object"
      },
      "CreditAttributionSubentitySchema": {
        "description": "One drill-down row within an attribution entity (column / account).",
        "properties": {
          "avg_cost_per_unit": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "credits_spent / units, in decimal credits; null when units is zero.",
            "title": "Avg Cost Per Unit"
          },
          "credits_refunded": {
            "description": "Refunded portion, reported separately, in decimal credits.",
            "title": "Credits Refunded",
            "type": "number"
          },
          "credits_spent": {
            "description": "Net of any refunds sharing this attribution, in decimal credits.",
            "title": "Credits Spent",
            "type": "number"
          },
          "entry_count": {
            "title": "Entry Count",
            "type": "integer"
          },
          "id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Column or integration id; null when unattributed.",
            "title": "Id"
          },
          "name": {
            "description": "Resolved display name.",
            "title": "Name",
            "type": "string"
          },
          "units": {
            "description": "Count of items charged.",
            "title": "Units",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "name",
          "credits_spent",
          "credits_refunded",
          "units",
          "entry_count",
          "avg_cost_per_unit"
        ],
        "title": "CreditAttributionSubentitySchema",
        "type": "object"
      },
      "CreditBalancePointSchema": {
        "description": "The credit balance at the end of one time bucket.",
        "properties": {
          "balance": {
            "description": "In decimal credits.",
            "title": "Balance",
            "type": "number"
          },
          "bucket_start": {
            "format": "date-time",
            "title": "Bucket Start",
            "type": "string"
          }
        },
        "required": [
          "bucket_start",
          "balance"
        ],
        "title": "CreditBalancePointSchema",
        "type": "object"
      },
      "CreditBalanceSummarySchema": {
        "description": "The global credit meter: credits left, allowance, period, and flags.",
        "properties": {
          "available": {
            "description": "Credits left to spend: the balance, floored at zero, in decimal credits. A running table's hold does not lower it.",
            "title": "Available",
            "type": "number"
          },
          "balance": {
            "description": "Settled credit balance, in decimal credits.",
            "title": "Balance",
            "type": "number"
          },
          "expiring": {
            "description": "Credits that expire at period_end if unspent, in decimal credits: what is left of the Free plan's monthly credits, which are spent first. Always 0 on a paid plan, whose credits never expire.",
            "title": "Expiring",
            "type": "number"
          },
          "held": {
            "description": "Credits in-flight runs set aside for their highest possible cost, in decimal credits. Still part of the balance until charged, so it does not lower the credits left.",
            "title": "Held",
            "type": "number"
          },
          "is_blocked": {
            "description": "The balance is empty; credit-consuming work is refused.",
            "title": "Is Blocked",
            "type": "boolean"
          },
          "is_low": {
            "description": "The balance is at or below the low-balance threshold.",
            "title": "Is Low",
            "type": "boolean"
          },
          "period_allowance": {
            "description": "Credits granted each period by the plan, in decimal credits.",
            "title": "Period Allowance",
            "type": "number"
          },
          "period_end": {
            "description": "When the allowance next refills.",
            "format": "date-time",
            "title": "Period End",
            "type": "string"
          },
          "period_start": {
            "description": "Start of the current grant period.",
            "format": "date-time",
            "title": "Period Start",
            "type": "string"
          }
        },
        "required": [
          "balance",
          "held",
          "available",
          "period_allowance",
          "period_start",
          "period_end",
          "expiring",
          "is_low",
          "is_blocked"
        ],
        "title": "CreditBalanceSummarySchema",
        "type": "object"
      },
      "CreditBalanceTimeseriesResponseSchema": {
        "description": "The balance-over-time series for the usage overview chart.",
        "properties": {
          "buckets": {
            "description": "Zero-gap series; the last known balance carries through empty buckets.",
            "items": {
              "$ref": "#/components/schemas/CreditBalancePointSchema"
            },
            "title": "Buckets",
            "type": "array"
          },
          "clamped_start": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set when the requested start predated the detail boundary and the series was clamped.",
            "title": "Clamped Start"
          },
          "interval": {
            "description": "Bucket size as served: hour or day.",
            "title": "Interval",
            "type": "string"
          }
        },
        "required": [
          "interval",
          "buckets",
          "clamped_start"
        ],
        "title": "CreditBalanceTimeseriesResponseSchema",
        "type": "object"
      },
      "CreditColumnUsageSchema": {
        "description": "Per-column credit usage for one table.",
        "properties": {
          "avg_cost_per_cell": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "credits / cells, in decimal credits; null at zero cells.",
            "title": "Avg Cost Per Cell"
          },
          "cell_count": {
            "title": "Cell Count",
            "type": "integer"
          },
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Column Id"
          },
          "credits_refunded": {
            "description": "Refunded portion, reported separately, in decimal credits.",
            "title": "Credits Refunded",
            "type": "number"
          },
          "credits_spent": {
            "description": "Net of any refunds attributed to this column, in decimal credits.",
            "title": "Credits Spent",
            "type": "number"
          },
          "name": {
            "description": "Resolved column name; 'Deleted column' when unresolvable.",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "column_id",
          "name",
          "cell_count",
          "avg_cost_per_cell",
          "credits_spent",
          "credits_refunded"
        ],
        "title": "CreditColumnUsageSchema",
        "type": "object"
      },
      "CreditEntryKind": {
        "description": "The kind of a credit ledger entry.",
        "enum": [
          "grant",
          "expiry",
          "pack_purchase",
          "charge",
          "refund",
          "referral",
          "adjustment"
        ],
        "title": "CreditEntryKind",
        "type": "string"
      },
      "CreditExportReport": {
        "description": "Which usage report a CSV export serves.",
        "enum": [
          "balance_timeseries",
          "spend_timeseries",
          "by_table",
          "by_provider",
          "by_agent",
          "table_timeseries",
          "table_by_column",
          "table_by_run",
          "ledger"
        ],
        "title": "CreditExportReport",
        "type": "string"
      },
      "CreditLedgerEntrySchema": {
        "description": "One immutable credit ledger entry.",
        "properties": {
          "amount": {
            "description": "Signed credits; charges are negative. In decimal credits.",
            "title": "Amount",
            "type": "number"
          },
          "balance_after": {
            "description": "In decimal credits.",
            "title": "Balance After",
            "type": "number"
          },
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Column Id"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "entry_kind": {
            "$ref": "#/components/schemas/CreditEntryKind"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "integration_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Integration Id"
          },
          "occurred_at": {
            "format": "date-time",
            "title": "Occurred At",
            "type": "string"
          },
          "provider_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Provider Key"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Run Id"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Table Id"
          },
          "unit_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "In decimal credits.",
            "title": "Unit Price"
          },
          "units": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Units"
          }
        },
        "required": [
          "id",
          "entry_kind",
          "amount",
          "balance_after",
          "occurred_at",
          "description",
          "table_id",
          "column_id",
          "run_id",
          "provider_key",
          "integration_id",
          "units",
          "unit_price"
        ],
        "title": "CreditLedgerEntrySchema",
        "type": "object"
      },
      "CreditPackCheckoutRequestSchema": {
        "description": "Request schema for starting a one-time credit pack purchase.",
        "properties": {
          "cancel_path": {
            "description": "Partial path (e.g. /billing) of where the stripe Checkout session should redirect the user if payment is cancelled.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Cancel Path",
            "type": "string"
          },
          "credits": {
            "description": "The number of credits to purchase.",
            "maximum": 100000000.0,
            "minimum": 1.0,
            "title": "Credits",
            "type": "integer"
          },
          "success_path": {
            "description": "Partial path (e.g. /billing) of where the stripe Checkout session should redirect the user if payment is successful.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Success Path",
            "type": "string"
          }
        },
        "required": [
          "credits",
          "success_path",
          "cancel_path"
        ],
        "title": "CreditPackCheckoutRequestSchema",
        "type": "object"
      },
      "CreditPackCheckoutResponseSchema": {
        "description": "Response schema for a started credit pack purchase.",
        "properties": {
          "checkout_url": {
            "description": "The URL to redirect the customer to complete the payment.",
            "format": "uri",
            "maxLength": 2083,
            "minLength": 1,
            "title": "Checkout Url",
            "type": "string"
          }
        },
        "required": [
          "checkout_url"
        ],
        "title": "CreditPackCheckoutResponseSchema",
        "type": "object"
      },
      "CreditPackQuoteReadSchema": {
        "description": "Response schema for the credit pack quote and purchase limits.",
        "properties": {
          "amount_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The total price in cents for the requested credit amount. None when no amount was requested.",
            "title": "Amount Cents"
          },
          "max_credits": {
            "description": "Maximum purchasable credits in a single pack.",
            "title": "Max Credits",
            "type": "integer"
          },
          "min_credits": {
            "description": "Minimum purchasable credits per pack.",
            "title": "Min Credits",
            "type": "integer"
          },
          "preset_credits": {
            "description": "Suggested pack sizes for the purchase dialog.",
            "items": {
              "type": "integer"
            },
            "title": "Preset Credits",
            "type": "array"
          },
          "unit_amount_decimal_per_credit": {
            "description": "Price per credit in cents (decimal string, e.g. '0.4').",
            "title": "Unit Amount Decimal Per Credit",
            "type": "string"
          }
        },
        "required": [
          "unit_amount_decimal_per_credit",
          "min_credits",
          "max_credits",
          "preset_credits",
          "amount_cents"
        ],
        "title": "CreditPackQuoteReadSchema",
        "type": "object"
      },
      "CreditPriceAiTierReadSchema": {
        "description": "One selectable AI tier and what it costs per operation.",
        "properties": {
          "ai_writing_credits": {
            "description": "The most one generated piece of copy costs: the tier's base, for ONE completion, not a whole sequence.",
            "title": "Ai Writing Credits",
            "type": "number"
          },
          "company_research_credits": {
            "description": "The most one researched record costs when the agent may browse the web: the tier's base plus its web-research add-on. A record is charged what its research used, never more.",
            "title": "Company Research Credits",
            "type": "number"
          },
          "display_name": {
            "description": "The tier's user-facing effort name, e.g. 'Medium'.",
            "title": "Display Name",
            "type": "string"
          },
          "key": {
            "description": "The model catalog key, e.g. 'core'.",
            "title": "Key",
            "type": "string"
          }
        },
        "required": [
          "key",
          "display_name",
          "company_research_credits",
          "ai_writing_credits"
        ],
        "title": "CreditPriceAiTierReadSchema",
        "type": "object"
      },
      "CreditPricesReadSchema": {
        "description": "The published unit prices behind the plan page's usage calculator.\n\nEvery figure is read from what the charge sites bill, converted to decimal\ncredits at this boundary, so a quote can never drift from a bill. A\nwaterfall's figure is what an answered row usually costs: each row is\ncharged the price of the provider that answered it.",
        "properties": {
          "ai_tiers": {
            "description": "The AI tiers, cheapest first.",
            "items": {
              "$ref": "#/components/schemas/CreditPriceAiTierReadSchema"
            },
            "title": "Ai Tiers",
            "type": "array"
          },
          "browser_use_credits_per_minute": {
            "description": "Credits per minute a Browser use step's cloud browser runs for one contact, its minutes rounded up. A run whose browser never opens never bills.",
            "title": "Browser Use Credits Per Minute",
            "type": "number"
          },
          "browser_use_max_minutes": {
            "description": "The most minutes one contact's Browser use run may last, and so be billed.",
            "title": "Browser Use Max Minutes",
            "type": "integer"
          },
          "cents_per_credit": {
            "description": "The dollar value of one credit, in cents.",
            "title": "Cents Per Credit",
            "type": "number"
          },
          "find_email_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Expected credits to find one work email across the provider waterfall. Only the winning provider bills. None when this deployment has no email-finding provider registered.",
            "title": "Find Email Credits"
          },
          "find_phone_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Expected credits to find one direct phone number across the provider waterfall. Only the winning provider bills. None when this deployment has no phone-finding provider registered.",
            "title": "Find Phone Credits"
          },
          "send_email_credits": {
            "description": "Credits per accepted outbound send. Failed sends never bill.",
            "title": "Send Email Credits",
            "type": "number"
          },
          "verify_email_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Expected credits to verify one email address across the provider waterfall. None when no verification provider is registered.",
            "title": "Verify Email Credits"
          }
        },
        "required": [
          "cents_per_credit",
          "ai_tiers",
          "find_email_credits",
          "find_phone_credits",
          "verify_email_credits",
          "send_email_credits",
          "browser_use_credits_per_minute",
          "browser_use_max_minutes"
        ],
        "title": "CreditPricesReadSchema",
        "type": "object"
      },
      "CreditRunUsageSchema": {
        "description": "Per-run credit usage for one table.",
        "properties": {
          "column_count": {
            "title": "Column Count",
            "type": "integer"
          },
          "credits_spent": {
            "description": "In decimal credits.",
            "title": "Credits Spent",
            "type": "number"
          },
          "description": {
            "description": "Server-composed summary, e.g. '10 cells across 1 column'.",
            "title": "Description",
            "type": "string"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Run Id"
          },
          "run_started_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The run's start time when resolvable, else the first charge time.",
            "title": "Run Started At"
          },
          "units": {
            "title": "Units",
            "type": "integer"
          }
        },
        "required": [
          "run_id",
          "run_started_at",
          "description",
          "units",
          "column_count",
          "credits_spent"
        ],
        "title": "CreditRunUsageSchema",
        "type": "object"
      },
      "CreditSpendBucketSchema": {
        "description": "Credits spent within one time bucket.",
        "properties": {
          "bucket_start": {
            "format": "date-time",
            "title": "Bucket Start",
            "type": "string"
          },
          "credits_refunded": {
            "description": "Refunded portion of the bucket, reported separately from credits_spent. 0 for rollup-granularity buckets (refunds are not broken out beyond the detail retention window). In decimal credits.",
            "title": "Credits Refunded",
            "type": "number"
          },
          "credits_spent": {
            "description": "Net of any refunds in the bucket, in decimal credits.",
            "title": "Credits Spent",
            "type": "number"
          },
          "units": {
            "description": "Items (cells) charged in the bucket.",
            "title": "Units",
            "type": "integer"
          }
        },
        "required": [
          "bucket_start",
          "credits_spent",
          "credits_refunded",
          "units"
        ],
        "title": "CreditSpendBucketSchema",
        "type": "object"
      },
      "CreditSpendTimeseriesResponseSchema": {
        "description": "The credits-spent series for the usage overview chart.",
        "properties": {
          "buckets": {
            "items": {
              "$ref": "#/components/schemas/CreditSpendBucketSchema"
            },
            "title": "Buckets",
            "type": "array"
          },
          "interval": {
            "description": "Bucket size of the detailed part: hour or day.",
            "title": "Interval",
            "type": "string"
          },
          "reduced_granularity_before": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Buckets before this boundary are month-granularity rollups.",
            "title": "Reduced Granularity Before"
          },
          "total_credits_refunded": {
            "description": "Headline refunded total for the range, in decimal credits.",
            "title": "Total Credits Refunded",
            "type": "number"
          },
          "total_credits_spent": {
            "description": "Headline total for the range, net of refunds, in decimal credits.",
            "title": "Total Credits Spent",
            "type": "number"
          },
          "total_units": {
            "title": "Total Units",
            "type": "integer"
          }
        },
        "required": [
          "interval",
          "buckets",
          "total_credits_spent",
          "total_credits_refunded",
          "total_units",
          "reduced_granularity_before"
        ],
        "title": "CreditSpendTimeseriesResponseSchema",
        "type": "object"
      },
      "CreditTableRunsCountSchema": {
        "description": "How many of one table's runs spent credits in a window, and what all of them spent.",
        "properties": {
          "count": {
            "description": "Runs in the window: every row the run report pages through.",
            "title": "Count",
            "type": "integer"
          },
          "total_credits_spent": {
            "description": "What every one of those runs spent, in decimal credits: the table's total.",
            "title": "Total Credits Spent",
            "type": "number"
          }
        },
        "required": [
          "count",
          "total_credits_spent"
        ],
        "title": "CreditTableRunsCountSchema",
        "type": "object"
      },
      "CreditTableUsageByColumnResponseSchema": {
        "description": "Per-column credit usage for one table.",
        "properties": {
          "columns": {
            "description": "Sorted by credits descending.",
            "items": {
              "$ref": "#/components/schemas/CreditColumnUsageSchema"
            },
            "title": "Columns",
            "type": "array"
          },
          "total_credits_refunded": {
            "description": "In decimal credits.",
            "title": "Total Credits Refunded",
            "type": "number"
          },
          "total_credits_spent": {
            "description": "In decimal credits.",
            "title": "Total Credits Spent",
            "type": "number"
          }
        },
        "required": [
          "columns",
          "total_credits_spent",
          "total_credits_refunded"
        ],
        "title": "CreditTableUsageByColumnResponseSchema",
        "type": "object"
      },
      "CreditUsageMetaSchema": {
        "description": "Boundaries of the usage history the reporting endpoints can serve.",
        "properties": {
          "detail_since": {
            "description": "Ranges before this boundary are served from monthly rollups (or clamped).",
            "format": "date-time",
            "title": "Detail Since",
            "type": "string"
          },
          "history_starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Earliest moment any usage data exists; null when no data yet.",
            "title": "History Starts At"
          }
        },
        "required": [
          "history_starts_at",
          "detail_since"
        ],
        "title": "CreditUsageMetaSchema",
        "type": "object"
      },
      "CurrencyOptions": {
        "description": "Options for a currency column.",
        "properties": {
          "currency_code": {
            "default": "USD",
            "description": "ISO-4217 code. Per column, not per cell: a column is denominated once.",
            "maxLength": 3,
            "minLength": 3,
            "title": "Currency Code",
            "type": "string"
          },
          "precision": {
            "default": 2,
            "description": "Digits kept after the point. A number written into the column (typed, pasted, imported or sent through the API) is rounded to them, half away from zero: 2.005 at 2 places is stored as 2.01. A formula, AI or enrichment value keeps every digit and only shows this many. Changing it later changes how existing values show, never the values themselves.",
            "maximum": 10.0,
            "minimum": 0.0,
            "title": "Precision",
            "type": "integer"
          },
          "type": {
            "const": "currency",
            "default": "currency",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "CurrencyOptions",
        "type": "object"
      },
      "DecimalOptions": {
        "description": "Options for a decimal column.",
        "properties": {
          "precision": {
            "default": 2,
            "description": "Digits kept after the point. A number written into the column (typed, pasted, imported or sent through the API) is rounded to them, half away from zero: 2.005 at 2 places is stored as 2.01. A formula, AI or enrichment value keeps every digit and only shows this many. Changing it later changes how existing values show, never the values themselves.",
            "maximum": 10.0,
            "minimum": 0.0,
            "title": "Precision",
            "type": "integer"
          },
          "type": {
            "const": "decimal",
            "default": "decimal",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "DecimalOptions",
        "type": "object"
      },
      "DecimalRangeFilterSchema": {
        "description": "An inclusive fractional range; either bound may be omitted.\n\nSeparate from ``RangeFilterSchema`` rather than loosening it: the whole-\nnumber filters here count people, employees and reviews, and letting a\nfraction into one of those would generate a client type that says a\nheadcount can be 4.5.",
        "properties": {
          "gte": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gte"
          },
          "lte": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lte"
          }
        },
        "title": "DecimalRangeFilterSchema",
        "type": "object"
      },
      "DesignPartnerBadgeReadSchema": {
        "description": "One badge on the design partner page.",
        "properties": {
          "awarded_at": {
            "description": "The date shown on the badge.",
            "format": "date-time",
            "title": "Awarded At",
            "type": "string"
          },
          "description": {
            "description": "What this workspace's feedback made possible, in our words.",
            "title": "Description",
            "type": "string"
          },
          "icon": {
            "description": "Icon token for the frontend's curated set. An unrecognised token falls back to a default rather than breaking the page, so the set can grow without a backend release.",
            "title": "Icon",
            "type": "string"
          },
          "id": {
            "description": "The badge's ID.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "title": {
            "description": "The badge's name.",
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "description",
          "icon",
          "awarded_at"
        ],
        "title": "DesignPartnerBadgeReadSchema",
        "type": "object"
      },
      "DesignPartnerFeedbackCreateSchema": {
        "description": "One submission from a member of a design partner workspace.",
        "properties": {
          "body": {
            "description": "What they want to tell us. Free text, no categories, no form.",
            "maxLength": 5000,
            "minLength": 1,
            "title": "Body",
            "type": "string"
          }
        },
        "required": [
          "body"
        ],
        "title": "DesignPartnerFeedbackCreateSchema",
        "type": "object"
      },
      "DesignPartnerFeedbackReadSchema": {
        "description": "One stored submission, as the workspace's own history shows it.\n\nThe whole workspace sees every member's submissions: the page is addressed\nto the organization, and a partner should be able to see what their\ncolleagues have already asked for rather than repeating it.",
        "properties": {
          "badge_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The badge it led to, when it shipped. Null otherwise.",
            "title": "Badge Id"
          },
          "body": {
            "description": "What they wrote.",
            "title": "Body",
            "type": "string"
          },
          "created_at": {
            "description": "When they wrote it.",
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "description": "The submission's ID.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DesignPartnerFeedbackStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "What our team did with it: 'seen', 'planned' or 'shipped', the furthest one reached. Null while nobody on our team has seen it."
          },
          "user_email": {
            "description": "Who wrote it, as their email was at the time they wrote it.",
            "title": "User Email",
            "type": "string"
          },
          "user_id": {
            "description": "Clerk user ID of who wrote it, so the page can show their name and tell the reader which submissions are their own.",
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "user_id",
          "user_email",
          "body",
          "created_at",
          "status",
          "badge_id"
        ],
        "title": "DesignPartnerFeedbackReadSchema",
        "type": "object"
      },
      "DesignPartnerFeedbackStatus": {
        "description": "What the partner's page says we did with one submission.",
        "enum": [
          "seen",
          "planned",
          "shipped"
        ],
        "title": "DesignPartnerFeedbackStatus",
        "type": "string"
      },
      "DesignPartnerSlackInviteCreateSchema": {
        "description": "The address a workspace wants its shared Slack channel invitation sent to.",
        "properties": {
          "email": {
            "description": "Where Slack sends the invitation. Typed by the caller rather than taken from their account, because the person who should be in the channel is not always the person setting it up.",
            "format": "email",
            "maxLength": 320,
            "title": "Email",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "title": "DesignPartnerSlackInviteCreateSchema",
        "type": "object"
      },
      "DesignPartnerSlackReadSchema": {
        "description": "The workspace's shared Slack channel and its one invitation.\n\nBoth belong to the organization, so every member of a partner workspace\nreads the same block: the same channel, the same invitation, whoever sent\nit. A Slack Connect guest can invite their own colleagues, so the second\nperson through the door is Slack's job rather than ours.",
        "properties": {
          "channel_failure_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What to tell the reader when provisioning failed. Null otherwise.",
            "title": "Channel Failure Message"
          },
          "channel_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The channel's name, without the leading hash. Null until it is ready.",
            "title": "Channel Name"
          },
          "channel_state": {
            "description": "Where the workspace's channel is. 'none' means nobody has sent an invite yet, which is what puts the form on the page. 'provisioning' is the run that creates it, which the page polls. 'failed' carries a sentence.",
            "enum": [
              "none",
              "provisioning",
              "ready",
              "failed"
            ],
            "title": "Channel State",
            "type": "string"
          },
          "channel_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A link that opens the channel in the reader's Slack. Null until it is ready.",
            "title": "Channel Url"
          },
          "invite_can_send": {
            "description": "Whether to offer the form. False while a run is in flight, while the invitation that went out is still live at Slack, and after a refusal about our own Slack workspace's settings that no retry fixes. Decided here so the page holds no copy of the lifetime and no opinion about which refusals are worth another press.",
            "title": "Invite Can Send",
            "type": "boolean"
          },
          "invite_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The address the Slack invitation went to.",
            "title": "Invite Email"
          },
          "invite_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What to tell the reader when Slack refused, already written for a person rather than a log. Null when nothing was refused.",
            "title": "Invite Message"
          },
          "invite_sent_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When Slack accepted the invitation.",
            "title": "Invite Sent At"
          },
          "invite_status": {
            "description": "What became of the workspace's Slack invitation.",
            "enum": [
              "none",
              "sent",
              "refused"
            ],
            "title": "Invite Status",
            "type": "string"
          }
        },
        "required": [
          "channel_state",
          "channel_failure_message",
          "channel_name",
          "channel_url",
          "invite_status",
          "invite_email",
          "invite_sent_at",
          "invite_message",
          "invite_can_send"
        ],
        "title": "DesignPartnerSlackReadSchema",
        "type": "object"
      },
      "DesignPartnerStatusReadSchema": {
        "description": "Whether the caller's workspace is a design partner, and its badges.\n\nOne read for three consumers (the sidebar item, the route guard and the\npage), so a workspace that is not a partner costs exactly one cheap query\nper session rather than three.",
        "properties": {
          "badges": {
            "description": "The workspace's badges, newest award first. Empty both for non-partners and for partners nobody has written a badge for yet. The page says so plainly rather than hiding the section.",
            "items": {
              "$ref": "#/components/schemas/DesignPartnerBadgeReadSchema"
            },
            "title": "Badges",
            "type": "array"
          },
          "is_design_partner": {
            "description": "Whether the caller's workspace is a design partner.",
            "title": "Is Design Partner",
            "type": "boolean"
          },
          "slack": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DesignPartnerSlackReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The shared Slack channel block. Null for a workspace that is not a design partner, and null when this deployment has no Slack workspace configured. The page hides the section rather than offering a button that cannot work."
          },
          "started_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Partner since. Null when the workspace is not a design partner.",
            "title": "Started At"
          }
        },
        "required": [
          "is_design_partner",
          "started_at",
          "badges",
          "slack"
        ],
        "title": "DesignPartnerStatusReadSchema",
        "type": "object"
      },
      "DetachedLeadSearchResponseSchema": {
        "description": "What removing a table's search did to the rows it had added.",
        "properties": {
          "count": {
            "default": 1,
            "description": "The number of resources that were deleted.",
            "title": "Count",
            "type": "integer"
          },
          "detail": {
            "description": "The detail of why the resource was deleted.",
            "title": "Detail",
            "type": "string"
          },
          "rows_deleted": {
            "description": "Rows deleted with the search; 0 when its rows were kept. On a dry run, the rows that would be.",
            "title": "Rows Deleted",
            "type": "integer"
          }
        },
        "required": [
          "detail",
          "rows_deleted"
        ],
        "title": "DetachedLeadSearchResponseSchema",
        "type": "object"
      },
      "DevEchoSettings": {
        "description": "Settings for the development-only echo action.\n\nThe delay is configurable so pipeline tests can run fast; the action's\ndisplay name promises one second, which is the default.",
        "properties": {
          "delay_ms": {
            "default": 1000,
            "maximum": 60000.0,
            "minimum": 0.0,
            "title": "Delay Ms",
            "type": "integer"
          },
          "kind": {
            "const": "dev_echo",
            "default": "dev_echo",
            "title": "Kind",
            "type": "string"
          }
        },
        "title": "DevEchoSettings",
        "type": "object"
      },
      "DevFlakySettings": {
        "description": "Settings for the development-only intermittent-failure action.\n\nFailures are deterministic PER ROW: whether a given row fails is a pure\nfunction of the seed and the row's identity, so a failing row fails\nidentically on every run, which is what makes retry policy, partial\nfailure and the errored re-run scope testable at all. Changing the seed\nchanges WHICH rows fail.",
        "properties": {
          "error_class": {
            "$ref": "#/components/schemas/EnrichmentErrorClass",
            "default": "provider_error",
            "description": "The error class every failing row reports."
          },
          "failure_rate": {
            "default": 0.5,
            "description": "The fraction of rows that fail.",
            "maximum": 1.0,
            "minimum": 0.0,
            "title": "Failure Rate",
            "type": "number"
          },
          "kind": {
            "const": "dev_flaky",
            "default": "dev_flaky",
            "title": "Kind",
            "type": "string"
          },
          "seed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Varies which rows fail; None derives purely from row identity.",
            "title": "Seed"
          }
        },
        "title": "DevFlakySettings",
        "type": "object"
      },
      "DoNotContactResponseSchema": {
        "properties": {
          "sequence_names": {
            "description": "The sequences those enrolments belong to, alphabetically.",
            "items": {
              "type": "string"
            },
            "title": "Sequence Names",
            "type": "array"
          },
          "stopped": {
            "description": "How many live enrolments were stopped with it.",
            "title": "Stopped",
            "type": "integer"
          },
          "updated": {
            "description": "How many of the conversations named were there to act on.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "stopped",
          "sequence_names"
        ],
        "title": "DoNotContactResponseSchema",
        "type": "object"
      },
      "DomainDelegationStatus": {
        "description": "Where a Google Workspace domain stands in the delegation handshake.\n\nPENDING means we know the domain but have not asked InboxKit to register\nour client id yet; AUTHORIZING means their async request is in flight;\nAUTHORIZED means minting tokens for that domain's mailboxes works; FAILED\ncarries a reason and is retryable (a new import attempt re-initiates).",
        "enum": [
          "pending",
          "authorizing",
          "authorized",
          "failed"
        ],
        "title": "DomainDelegationStatus",
        "type": "string"
      },
      "DraftRating": {
        "description": "The human verdict on a drafted reply.\n\nTwo values, not five stars: a triaging human will click a thumb, not\ndeliberate over a scale, and \"good or bad\" is all a feedback loop needs.",
        "enum": [
          "good",
          "bad"
        ],
        "title": "DraftRating",
        "type": "string"
      },
      "DraftSendOutcome": {
        "description": "How the words a person sent stand to the reply the AI wrote.\n\n``AS_WRITTEN``: the AI's words, unchanged. ``EDITED``: the person changed them and\nkept what they say, which is the one outcome that teaches the agent. ``REPLACED``: the\nperson sent a reply of their own in its place, which credits the agent with nothing.\nDecided before the send, never by the send.",
        "enum": [
          "as_written",
          "edited",
          "replaced"
        ],
        "title": "DraftSendOutcome",
        "type": "string"
      },
      "DrivePickerTokenReadSchema": {
        "description": "What the browser needs to open the Google Picker.",
        "properties": {
          "access_token": {
            "description": "A short-lived token scoped to drive.file. Never store it.",
            "title": "Access Token",
            "type": "string"
          },
          "app_id": {
            "description": "The GCP project number, for PickerBuilder.setAppId.",
            "title": "App Id",
            "type": "string"
          },
          "developer_key": {
            "description": "The public browser API key, for PickerBuilder.setDeveloperKey.",
            "title": "Developer Key",
            "type": "string"
          },
          "expires_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires At"
          }
        },
        "required": [
          "access_token",
          "expires_at",
          "app_id",
          "developer_key"
        ],
        "title": "DrivePickerTokenReadSchema",
        "type": "object"
      },
      "DroppedChangeReadSchema": {
        "description": "A change a later note took back.",
        "properties": {
          "id": {
            "description": "The change's id, as it was.",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ChangeKind"
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What it said.",
            "title": "Text"
          }
        },
        "required": [
          "id",
          "kind",
          "text"
        ],
        "title": "DroppedChangeReadSchema",
        "type": "object"
      },
      "EarlierLeadTableSchema": {
        "description": "A table the same search already built, found through the search history.",
        "properties": {
          "built_at": {
            "description": "When that search built the table.",
            "format": "date-time",
            "title": "Built At",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "built_at"
        ],
        "title": "EarlierLeadTableSchema",
        "type": "object"
      },
      "EditDraftSchema": {
        "properties": {
          "body_text": {
            "maxLength": 20000,
            "minLength": 1,
            "title": "Body Text",
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          }
        },
        "required": [
          "body_text"
        ],
        "title": "EditDraftSchema",
        "type": "object"
      },
      "EffectiveApprovalReadSchema": {
        "description": "The mode that actually applies per channel, and which level set it.",
        "properties": {
          "assigned_sender_send_modes": {
            "description": "Each sender assigned to the sequence, by name, with their own send mode as it applies in this sequence. Empty unless `sequence_id` is given.",
            "items": {
              "$ref": "#/components/schemas/AssignedSenderSendModeReadSchema"
            },
            "title": "Assigned Sender Send Modes",
            "type": "array"
          },
          "cadence_email_send_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SenderSendMode"
              },
              {
                "type": "null"
              }
            ],
            "description": "The send mode every email the sequence itself sends runs under: the strictest of its assigned senders', because its emails go out from every assigned sender's mailboxes in turn. `always_ask` when the sequence asks for approval or has no senders assigned. Null unless `sequence_id` is given."
          },
          "email_level": {
            "$ref": "#/components/schemas/ApprovalLevel",
            "description": "Where the email mode came from: `sender` when they set one, `sequence` when a sequence demands a person, `default` when nobody has decided."
          },
          "email_mode": {
            "$ref": "#/components/schemas/ApprovalMode",
            "description": "Whether email steps wait for a person (`manual`) or send on their own (`auto`). The older two-way setting; `email_send_mode` and `cadence_email_send_mode` say what actually happens to each email."
          },
          "email_send_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SenderSendMode"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender's own send mode, tightened to `always_ask` when the given sequence asks for approval. It decides the agent's replies from their mailboxes (in that sequence's conversations, when `sequence_id` is given); a sequence's own emails run under `cadence_email_send_mode` instead. `always_send` sends every email; `send_when_confident` sends an agent-written email when the agent rated its own message high and had enough data, and holds back the rest; `always_ask` has a person approve every email. Null unless `sender_profile_id` is given."
          },
          "linkedin_level": {
            "$ref": "#/components/schemas/ApprovalLevel",
            "description": "Where the LinkedIn mode came from: `sender` when they set one, `sequence` when a sequence demands a person, `default` when nobody has decided."
          },
          "linkedin_mode": {
            "$ref": "#/components/schemas/ApprovalMode",
            "description": "Whether LinkedIn steps wait for a person (`manual`) or run on their own (`auto`)."
          }
        },
        "required": [
          "linkedin_mode",
          "linkedin_level",
          "email_mode",
          "email_level",
          "email_send_mode",
          "cadence_email_send_mode",
          "assigned_sender_send_modes"
        ],
        "title": "EffectiveApprovalReadSchema",
        "type": "object"
      },
      "EmailApprovalMode": {
        "description": "Whether a sender's email steps wait in the approval queue or send on their own.\n\nThe per-sender override of the workspace's email approval mode. The\nworkspace setting lives in the outreach-task domain, a layer above this\none, so this enum names only the two overrides a sender can carry; the\nabsence of one (``SenderProfileDTO.email_approval_mode`` is None) means\nthe sender follows the workspace.",
        "enum": [
          "manual",
          "auto"
        ],
        "title": "EmailApprovalMode",
        "type": "string"
      },
      "EmailClosingReadSchema": {
        "description": "What a send adds below an email's words: the sender's signature, then the opt-out footer.",
        "properties": {
          "opt_out_footer": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sequence's opt-out footer, last of all, as the email carries it: its unsubscribe link written `[unsubscribe here](url)` in a formatted sequence and as the bare URL in a plain-text one. In a preview the link unsubscribes nobody. Null when the sequence has no footer.",
            "title": "Opt Out Footer"
          },
          "signature": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The signature the email ends with, its sender variables filled in as the send fills them: the mailbox about to send, or else the first sender, the sender a preview writes as. Null when the sender has none.",
            "title": "Signature"
          }
        },
        "required": [
          "signature",
          "opt_out_footer"
        ],
        "title": "EmailClosingReadSchema",
        "type": "object"
      },
      "EmailDeliverability": {
        "description": "The verdicts a Verify email column answers with, in the words its cells hold.\n\nThe ``verify_email`` chain respells every supplier's verdict onto exactly\nthese words (``email_verdict_canonical`` in ``table_enrichments``), so a\nsequence that reads the column compares its cells against them. Ordered\nfrom the safest to send to, which is the order the Audience tab lists them.",
        "enum": [
          "valid",
          "catch-all",
          "risky",
          "unknown",
          "invalid",
          "disposable"
        ],
        "title": "EmailDeliverability",
        "type": "string"
      },
      "EmailStepColumnsSchema": {
        "description": "Which of a table's columns look like a written subject, first email and follow-ups.",
        "properties": {
          "first_email_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A column holding the first email's body.",
            "title": "First Email Column Id"
          },
          "follow_up_column_ids": {
            "description": "Columns holding follow-up bodies, in the order they send.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Follow Up Column Ids",
            "type": "array"
          },
          "subject_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A column holding a subject line.",
            "title": "Subject Column Id"
          }
        },
        "title": "EmailStepColumnsSchema",
        "type": "object"
      },
      "EmailVerificationEstimateReadSchema": {
        "description": "What verifying the audience's addresses would cover and cost, before it runs.",
        "properties": {
          "adds_column": {
            "description": "True when that column does not exist yet and verifying adds it to the audience table first, over the sequence's email column. Adding it costs nothing.",
            "title": "Adds Column",
            "type": "boolean"
          },
          "balance_sufficient": {
            "description": "Whether the workspace's available credits cover the most it could cost.",
            "title": "Balance Sufficient",
            "type": "boolean"
          },
          "column_name": {
            "description": "The Verify email column the verdicts land in, by its name on the table.",
            "title": "Column Name",
            "type": "string"
          },
          "estimated_credits": {
            "description": "The most it could cost, in credits: every row priced in full.",
            "title": "Estimated Credits",
            "type": "number"
          },
          "expected_credits": {
            "description": "What it usually costs, in credits: each row is charged the price of the source that answered it, read from which sources usually answer. Quote it before estimated_credits, never instead of it: about this, up to estimated_credits. When the two are equal the check has one price: then quote that one figure, without up to.",
            "title": "Expected Credits",
            "type": "number"
          },
          "maps_column": {
            "description": "True when the sequence does not read that column yet and verifying points its email deliverability at it, keeping the verdicts it emails.",
            "title": "Maps Column",
            "type": "boolean"
          },
          "rows": {
            "description": "Addresses it would verify: audience rows with an email that the Verify email column has not checked yet. The same number the launch check's `emails_not_verified` finding carries in `count`. Zero when every address already has a verdict and only the sequence has to read them.",
            "title": "Rows",
            "type": "integer"
          },
          "scope_too_large": {
            "description": "True when more addresses are unverified than one run may cover. Narrow the audience's view first; running is refused until then.",
            "title": "Scope Too Large",
            "type": "boolean"
          }
        },
        "required": [
          "rows",
          "expected_credits",
          "estimated_credits",
          "balance_sufficient",
          "scope_too_large",
          "column_name",
          "adds_column",
          "maps_column"
        ],
        "title": "EmailVerificationEstimateReadSchema",
        "type": "object"
      },
      "EmailVerificationProgressReadSchema": {
        "description": "How far the audience's Verify email column has got, counted as sending judges it.\n\nCounted only while a run is checking the column: every count is zero\notherwise. Who is still unchecked once it stops is the audience preview's\nemail_unchecked.",
        "properties": {
          "checked": {
            "description": "Of those, the addresses the Verify email column has answered for.",
            "title": "Checked",
            "type": "integer"
          },
          "failed": {
            "description": "Checked addresses whose check failed. They count as Unknown, emailed only when the sequence sends to Unknown.",
            "title": "Failed",
            "type": "integer"
          },
          "pending": {
            "description": "Of those, the addresses still waiting for their check: exactly the contacts sending holds as Verifying email, whose email steps wait for the verdict while their LinkedIn steps go on.",
            "title": "Pending",
            "type": "integer"
          },
          "total": {
            "description": "Audience rows with an email address: everyone whose address is checked.",
            "title": "Total",
            "type": "integer"
          },
          "verifying": {
            "description": "True while a Verify email run is still checking addresses and some are waiting. Launching meanwhile is allowed: nobody is emailed before their check.",
            "title": "Verifying",
            "type": "boolean"
          }
        },
        "required": [
          "total",
          "checked",
          "pending",
          "failed",
          "verifying"
        ],
        "title": "EmailVerificationProgressReadSchema",
        "type": "object"
      },
      "EmailVerificationRunReadSchema": {
        "description": "The run that is now verifying the audience's addresses.",
        "properties": {
          "column_id": {
            "description": "The Verify email column the run fills in.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "description": "That column's name on the table.",
            "title": "Column Name",
            "type": "string"
          },
          "rows": {
            "description": "Addresses the run is verifying.",
            "title": "Rows",
            "type": "integer"
          },
          "run": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRunReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The run, or null when there was nothing to verify or its start is still queued; the table's active runs pick it up either way."
          },
          "table_id": {
            "description": "The sequence's audience table.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "rows",
          "table_id",
          "column_id",
          "column_name",
          "run"
        ],
        "title": "EmailVerificationRunReadSchema",
        "type": "object"
      },
      "EmployerRole": {
        "description": "Which of a person's jobs places them at an employer: the one held now, or one that ended.",
        "enum": [
          "current",
          "past"
        ],
        "title": "EmployerRole",
        "type": "string"
      },
      "EnrichmentActionCategory": {
        "description": "The section an enrichment action sits under in the picker.\n\nOrdered as the picker shows them. ``DEVELOPMENT`` exists so the dev-only\ntest actions render under their own clearly-labelled heading and can never\nbe mistaken for a product feature.",
        "enum": [
          "ai",
          "web",
          "workspace",
          "enrichment",
          "development"
        ],
        "title": "EnrichmentActionCategory",
        "type": "string"
      },
      "EnrichmentActionEffortSchema": {
        "description": "One effort level an agent offers, and what a row costs at it.",
        "properties": {
          "credits_per_row": {
            "description": "What a row this level answers costs, in decimal credits.",
            "title": "Credits Per Row",
            "type": "number"
          },
          "display_name": {
            "description": "The level's name on the Effort setting, e.g. 'High'.",
            "title": "Display Name",
            "type": "string"
          },
          "is_default": {
            "description": "Whether a column with no model_key runs at this level.",
            "title": "Is Default",
            "type": "boolean"
          },
          "model_key": {
            "description": "The catalog model key a column stores as its model_key to run at this level; the default level is stored as no model_key.",
            "title": "Model Key",
            "type": "string"
          }
        },
        "required": [
          "model_key",
          "display_name",
          "credits_per_row",
          "is_default"
        ],
        "title": "EnrichmentActionEffortSchema",
        "type": "object"
      },
      "EnrichmentActionSchema": {
        "description": "One enrichment action as the picker renders it.",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/EnrichmentActionCategory",
            "description": "The picker section this action sits under."
          },
          "column_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The noun a new column made from this action takes as its header. Separate from `display_name`, which sells the action in the picker and reads as a job ('Find a person's LinkedIn profile'), while a header names what the cells hold ('LinkedIn profile'). Null means the action never needed the distinction: a single-output action IS its output, so the frontend takes that output's name.",
            "title": "Column Name"
          },
          "credentials": {
            "$ref": "#/components/schemas/ProviderCredentials",
            "description": "Whose account this action's calls are billed to. 'platform' means we hold the credentials and charge credits for the row; 'customer' means it runs on the customer's own connected account and spends its quota, so the catalog quotes no credit price on the row."
          },
          "credits_per_row": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The action's own per-successful-row price in decimal credits, when it prices per action rather than per model: the price itself, or, when usual_credits_per_row is set, the most one row can cost. Surfaces as the cost label on catalog rows and in the editor; null means the price derives from the selected model.",
            "title": "Credits Per Row"
          },
          "degraded": {
            "default": false,
            "description": "True when a waterfall currently has ZERO live suppliers: every rung's vendor is unprovisioned, out of quota, or holding a dead key. The picker greys the row with a reason so nobody buys into a tool that cannot answer any row right now. Always false for non-waterfall actions.",
            "title": "Degraded",
            "type": "boolean"
          },
          "description": {
            "description": "One line: what the action does.",
            "title": "Description",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "efforts": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/EnrichmentActionEffortSchema"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set for a built-in agent offered at more than one effort level: each level, cheapest first, with what a row costs at it. credits_per_row is the default level's price. A column picks a level through its model_key, and only these keys are accepted. Null for every other action.",
            "title": "Efforts"
          },
          "family": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentFamily"
              },
              {
                "type": "null"
              }
            ],
            "description": "The outcome shelf this action sits on WITHIN its category's tab: the second level under `category`, which picks the tab itself. Set on the data enrichments, whose tab is one long list authored by input ('Enrich person from email', '...from LinkedIn') and read by outcome; null on everything else, and on a stored waterfall filed under a value this deployment no longer knows."
          },
          "icon": {
            "description": "An icon token the frontend maps to an asset.",
            "title": "Icon",
            "type": "string"
          },
          "input_contract": {
            "description": "The settings kind this action accepts: what an action_settings payload must declare to configure it. Also how the editor knows the shape of the configuration: 'enrichment' binds every declared input to a column, 'column' binds exactly one and has no prompt at all, and everything else is prompt-driven.",
            "title": "Input Contract",
            "type": "string"
          },
          "input_sets": {
            "description": "The smallest sets of inputs (by name) that let a row run, any one of which is enough, smallest first. A column bound to none of them is refused at save, so the editor outlines the nearest set's missing inputs as Required before sending it. Empty for every action but a data enrichment.",
            "items": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "title": "Input Sets",
            "type": "array"
          },
          "inputs": {
            "description": "The facts this action needs supplied, each bound to a column. Empty for the prompt-driven actions. Several sources are checked behind one data enrichment and they need different facts, so binding a subset is normal there: it narrows which can run, it does not break the column. A 'column'-contract action declares exactly one, and it is the whole configuration.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentCanonicalFieldSchema"
            },
            "title": "Inputs",
            "type": "array"
          },
          "key": {
            "description": "The registry key stored on enrichment column definitions.",
            "title": "Key",
            "type": "string"
          },
          "keywords": {
            "description": "Extra words the Tools search finds this action by, beyond its name and description: how a person describes the job ('follow up', 'pain point'). Authored per built-in agent in the catalog file; empty for everything else.",
            "items": {
              "type": "string"
            },
            "title": "Keywords",
            "type": "array"
          },
          "offers_second_check": {
            "default": false,
            "description": "Whether a column of this enrichment may turn on a second check (settings.second_check): Verify email sends a catch-all answer on to the next verifier. A column with it on can cost one more check per row, charged only when the second check gives a definite answer.",
            "title": "Offers Second Check",
            "type": "boolean"
          },
          "output_contract": {
            "description": "What the action produces: 'text' (one free-form value), 'structured' (obeys the column's declared output schema) or 'object' (a fixed object whose fields are this action's declared `outputs`, so nothing for a column to declare and no output builder). Consumers branch on THIS, never on the key.",
            "title": "Output Contract",
            "type": "string"
          },
          "outputs": {
            "description": "The facts this action can return. A data enrichment's output builder seeds from these; for an 'object'-contract action they ARE the output, fixed, and there is nothing to build.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentCanonicalFieldSchema"
            },
            "title": "Outputs",
            "type": "array"
          },
          "pricing_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The credit price-catalog key this action charges against; null is free.",
            "title": "Pricing Key"
          },
          "provider_operation": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentProviderOperationSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "For provider-category actions only: which integration operation this action fronts, with its typed inputs and outputs. The editor renders input bindings and default output fields from this. There is no per-provider frontend."
          },
          "refund_rules": {
            "description": "The action's declared refund promises: 'success_no_data' (an empty-handed success is free), 'success_blocked_data' (compliance-withheld data is free), 'success_preview_run' (previews are charged then refunded). The editor prints these so the promise is visible before running.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentRefundRule"
            },
            "title": "Refund Rules",
            "type": "array"
          },
          "second_check_share_without_history": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set when offers_second_check is: the share of rows a column with its second check on (settings.second_check true) is usually charged a second check for, while it has no history yet. Its usual figure is credits_per_row times (1 + this share); its most is twice credits_per_row. A saved column reads its own usual_credits_per_row from the credit-rates route. Null when the enrichment offers no second check.",
            "title": "Second Check Share Without History"
          },
          "settings_fields": {
            "description": "The action's own configuration, field by field. One generic editor renders these, so an action with settings never waits for a frontend of its own.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentActionSettingFieldSchema"
            },
            "title": "Settings Fields",
            "type": "array"
          },
          "shelf": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BuiltinAgentShelf"
              },
              {
                "type": "null"
              }
            ],
            "description": "The Enrichment tab shelf a built-in agent is ALSO listed on ('research' or 'write'), after the data shelves. The agent stays on the Agent tab either way; null lists it there only, and is the answer for every action that is not a built-in agent."
          },
          "tagline": {
            "description": "A few words for the picker's meta line; empty falls back to the category word.",
            "title": "Tagline",
            "type": "string"
          },
          "usual_credits_per_row": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set for an enrichment whose sources are priced differently: a row is charged the price of the source that answered it, never more than credits_per_row, and this is what an answered row usually costs, read from the platform's recent rows (about this, up to credits_per_row). Null when the action has one price.",
            "title": "Usual Credits Per Row"
          }
        },
        "required": [
          "key",
          "display_name",
          "category",
          "description",
          "tagline",
          "icon",
          "pricing_key",
          "input_contract",
          "output_contract",
          "credentials"
        ],
        "title": "EnrichmentActionSchema",
        "type": "object"
      },
      "EnrichmentActionSettingFieldSchema": {
        "description": "One configurable setting of an action, as the editor renders it.",
        "properties": {
          "default": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default"
          },
          "description": {
            "title": "Description",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "kind": {
            "description": "How to draw the control: 'text', 'textarea', 'number', 'boolean', 'select', 'key_value' (string map), 'column' (a picker over this table's columns) or 'table' (a picker over the workspace's tables, writing the table's id).",
            "title": "Kind",
            "type": "string"
          },
          "least": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The smallest a 'number' field takes, when it has a floor.",
            "title": "Least"
          },
          "most": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The largest a 'number' field takes, when it has a ceiling.",
            "title": "Most"
          },
          "name": {
            "description": "The payload key this field writes.",
            "title": "Name",
            "type": "string"
          },
          "options": {
            "description": "Allowed values for a 'select' field.",
            "items": {
              "type": "string"
            },
            "title": "Options",
            "type": "array"
          },
          "required": {
            "default": false,
            "title": "Required",
            "type": "boolean"
          },
          "secret": {
            "default": false,
            "description": "Render masked.",
            "title": "Secret",
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "display_name",
          "description",
          "kind"
        ],
        "title": "EnrichmentActionSettingFieldSchema",
        "type": "object"
      },
      "EnrichmentAuditFieldChangeSchema": {
        "description": "A single field change in an edit.",
        "properties": {
          "field": {
            "title": "Field",
            "type": "string"
          },
          "new_value": {
            "title": "New Value"
          },
          "old_value": {
            "title": "Old Value"
          }
        },
        "required": [
          "field",
          "old_value",
          "new_value"
        ],
        "title": "EnrichmentAuditFieldChangeSchema",
        "type": "object"
      },
      "EnrichmentAuditLogReadSchema": {
        "description": "Read schema for one enrichment audit log entry.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/TableEnrichmentAuditAction"
          },
          "actor": {
            "title": "Actor",
            "type": "string"
          },
          "actor_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Actor Display Name"
          },
          "actor_type": {
            "$ref": "#/components/schemas/ActorKind"
          },
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Column Id"
          },
          "context": {
            "discriminator": {
              "mapping": {
                "assistant_applied": "#/components/schemas/AssistantAppliedContextSchema",
                "assistant_undone": "#/components/schemas/AssistantUndoneContextSchema",
                "configured": "#/components/schemas/EnrichmentConfiguredContextSchema",
                "cost_incurred": "#/components/schemas/EnrichmentCostIncurredContextSchema",
                "edited": "#/components/schemas/EnrichmentEditedContextSchema",
                "export_configured": "#/components/schemas/ExportConfiguredContextSchema",
                "export_run_requested": "#/components/schemas/ExportRunRequestedContextSchema",
                "file_exported": "#/components/schemas/ExportFileDownloadedContextSchema",
                "run_cancelled": "#/components/schemas/EnrichmentRunCancelledContextSchema",
                "run_requested": "#/components/schemas/EnrichmentRunRequestedContextSchema",
                "unrecognised": "#/components/schemas/UnrecognisedEnrichmentContextSchema"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnrichmentConfiguredContextSchema"
              },
              {
                "$ref": "#/components/schemas/EnrichmentEditedContextSchema"
              },
              {
                "$ref": "#/components/schemas/EnrichmentRunRequestedContextSchema"
              },
              {
                "$ref": "#/components/schemas/EnrichmentRunCancelledContextSchema"
              },
              {
                "$ref": "#/components/schemas/EnrichmentCostIncurredContextSchema"
              },
              {
                "$ref": "#/components/schemas/ExportConfiguredContextSchema"
              },
              {
                "$ref": "#/components/schemas/ExportRunRequestedContextSchema"
              },
              {
                "$ref": "#/components/schemas/ExportFileDownloadedContextSchema"
              },
              {
                "$ref": "#/components/schemas/AssistantAppliedContextSchema"
              },
              {
                "$ref": "#/components/schemas/AssistantUndoneContextSchema"
              },
              {
                "$ref": "#/components/schemas/UnrecognisedEnrichmentContextSchema"
              }
            ],
            "title": "Context"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "proposal_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Proposal Id"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "column_id",
          "action",
          "actor_type",
          "actor",
          "context",
          "created_at"
        ],
        "title": "EnrichmentAuditLogReadSchema",
        "type": "object"
      },
      "EnrichmentCanonicalFieldSchema": {
        "description": "One fact a data enrichment takes in or gives back.",
        "properties": {
          "always_present": {
            "default": true,
            "description": "Outputs only: whether a successful row always carries this fact. False marks a fact that can come back empty even when the enrichment worked, so the editor can say so while the column is being set up rather than leaving it to be discovered.",
            "title": "Always Present",
            "type": "boolean"
          },
          "auto_promote": {
            "default": true,
            "description": "Outputs only: whether the fan-out gives this fact a column of its own. False keeps it payload-only (stored with the answer and promotable by hand) for provenance-grade facts that would otherwise widen every table they land on.",
            "title": "Auto Promote",
            "type": "boolean"
          },
          "choices": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Select outputs only: the fixed vocabulary the answer comes from, so a column created from this fact is born with its options set.",
            "title": "Choices"
          },
          "creates_column": {
            "default": true,
            "description": "Outputs only: whether setting this action up actually adds a column for this fact. Derived: it is auto_promote AND a type the fan-out can expand (a list or nested object has no single cell shape and stays in the payload). Sent already resolved so the column editor's outputs preview can promise exactly the columns that will appear, rather than restating two rules and drifting.",
            "title": "Creates Column",
            "type": "boolean"
          },
          "description": {
            "title": "Description",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "field_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "description": "The column type this fact stores as."
          },
          "name": {
            "description": "The key a column's bindings and output fields use.",
            "title": "Name",
            "type": "string"
          },
          "required": {
            "default": false,
            "description": "Inputs only: whether the enrichment cannot run without it. False where several facts can each drive it.",
            "title": "Required",
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "display_name",
          "description",
          "field_type"
        ],
        "title": "EnrichmentCanonicalFieldSchema",
        "type": "object"
      },
      "EnrichmentCellOutcome": {
        "description": "How one cell's enrichment execution ended.\n\n``SKIPPED`` is a first-class third outcome: the action was deliberately\nnot run (a required input was empty), no work was done, and nothing is\ncharged.\n\n``WAITING`` hands the cell to work that runs outside the table run (a\nsender's LinkedIn browser, minutes to days away): the cell stays owed with\nno value, says what it waits for, and is filled by whoever hands the\nanswer back. Nothing is charged here; the outside work charges for itself.",
        "enum": [
          "succeeded",
          "failed",
          "skipped",
          "waiting"
        ],
        "title": "EnrichmentCellOutcome",
        "type": "string"
      },
      "EnrichmentCellRunSchema": {
        "description": "One cell's most recent enrichment execution, for inspection.\n\n``raw_response`` is the model's STRUCTURED payload (the parsed fields,\npre-coercion), never the provider transcript; summaries and error text\nstay sanitized and length-capped, so nothing here needs masking after\nthe fact.",
        "properties": {
          "action_key": {
            "title": "Action Key",
            "type": "string"
          },
          "business_context_empty": {
            "description": "Whether the column asked for the workspace's business context and there was none, so the run worked without it.",
            "title": "Business Context Empty",
            "type": "boolean"
          },
          "cached_tokens": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Prompt tokens served from cache; null when unreported.",
            "title": "Cached Tokens"
          },
          "completion_tokens": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Completion tokens used; null when unreported.",
            "title": "Completion Tokens"
          },
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentConfidence"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's own read on the answer; null for non-agent actions."
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "credits_breakdown": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "number"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "What credits_charged is made of, in decimal credits: 'research' (the agent's own work) plus one entry per lookup that found something, keyed 'find_work_email' / 'read_linkedin_profile'. Null for every other cell.",
            "title": "Credits Breakdown"
          },
          "credits_charged": {
            "description": "What executing this cell cost, by the page charge's rule.",
            "title": "Credits Charged",
            "type": "number"
          },
          "credits_max": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The most this cell could have cost, in decimal credits, when its action charges what a row used under a per-row maximum (Use AI); null otherwise.",
            "title": "Credits Max"
          },
          "details_pruned": {
            "description": "Whether the run is past detail retention. When true, empty trail fields (steps, reasoning, sources) mean the detail aged out, not that the run never had one.",
            "title": "Details Pruned",
            "type": "boolean"
          },
          "duration_ms": {
            "title": "Duration Ms",
            "type": "integer"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "error_class": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentErrorClass"
              },
              {
                "type": "null"
              }
            ]
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "model_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Key"
          },
          "outcome": {
            "$ref": "#/components/schemas/EnrichmentCellOutcome"
          },
          "prompt_text": {
            "description": "The resolved per-row prompt the action received.",
            "title": "Prompt Text",
            "type": "string"
          },
          "prompt_tokens": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Prompt tokens used; null when unreported.",
            "title": "Prompt Tokens"
          },
          "raw_response": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model's structured payload exactly as returned, before coercion; null when the action produced none.",
            "title": "Raw Response"
          },
          "reasoning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reasoning"
          },
          "reasoning_tokens": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hidden reasoning tokens billed as output; null when unreported.",
            "title": "Reasoning Tokens"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table run that executed the cell.",
            "title": "Run Id"
          },
          "source_attempts": {
            "description": "A curated enrichment's per-attempt trail; empty elsewhere.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentRunSourceAttemptSchema"
            },
            "title": "Source Attempts",
            "type": "array"
          },
          "sources": {
            "description": "The pages the agent successfully read, deduplicated.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentRunSourceSchema"
            },
            "title": "Sources",
            "type": "array"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/EnrichmentRunStepSchema"
            },
            "title": "Steps",
            "type": "array"
          },
          "total_tokens": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Total tokens used; null when unreported.",
            "title": "Total Tokens"
          },
          "web_read_credits": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Web-read credits the run's page fetches billed, summed across steps; null for cells without web tools or rows predating the telemetry.",
            "title": "Web Read Credits"
          }
        },
        "required": [
          "id",
          "run_id",
          "action_key",
          "model_key",
          "prompt_text",
          "outcome",
          "error",
          "error_class",
          "duration_ms",
          "confidence",
          "reasoning",
          "steps",
          "sources",
          "raw_response",
          "prompt_tokens",
          "completion_tokens",
          "total_tokens",
          "cached_tokens",
          "reasoning_tokens",
          "web_read_credits",
          "credits_charged",
          "credits_max",
          "credits_breakdown",
          "source_attempts",
          "created_at",
          "details_pruned",
          "business_context_empty"
        ],
        "title": "EnrichmentCellRunSchema",
        "type": "object"
      },
      "EnrichmentColumnDefinition-Input": {
        "description": "Definition of an enrichment column: an external action run once per row.\n\nThe action is named by its registry key; everything the action needs to run\n(its prompt, model, output shape, settings) grows on this member rather\nthan on the column row, so the definition-version snapshot covers all of\nit.",
        "properties": {
          "action_key": {
            "description": "The enrichment action's registry key; validated against the catalog.",
            "maxLength": 100,
            "minLength": 1,
            "title": "Action Key",
            "type": "string"
          },
          "action_settings": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "agent": "#/components/schemas/AgentSettings",
                    "builtin": "#/components/schemas/BuiltinAgentSettings",
                    "dev_echo": "#/components/schemas/DevEchoSettings",
                    "dev_flaky": "#/components/schemas/DevFlakySettings",
                    "enrichment": "#/components/schemas/EnrichmentSettings",
                    "http_api": "#/components/schemas/HttpApiSettings-Input",
                    "http_api_jwt": "#/components/schemas/HttpApiJwtSettings-Input",
                    "integration_lookup": "#/components/schemas/IntegrationLookupSettings",
                    "linkedin_browser": "#/components/schemas/LinkedInBrowserSettings",
                    "linkedin_company_graph": "#/components/schemas/LinkedInCompanyGraphSettings",
                    "outreach_activity": "#/components/schemas/OutreachActivitySettings",
                    "provider": "#/components/schemas/ProviderSettings",
                    "reference": "#/components/schemas/ReferenceSettings-Input",
                    "referencing_rows": "#/components/schemas/ReferencingRowsSettings",
                    "rep_data": "#/components/schemas/RepDataSettings",
                    "send_to_table": "#/components/schemas/SendToTableSettings",
                    "use_ai": "#/components/schemas/UseAISettings"
                  },
                  "propertyName": "kind"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/UseAISettings"
                  },
                  {
                    "$ref": "#/components/schemas/BuiltinAgentSettings"
                  },
                  {
                    "$ref": "#/components/schemas/AgentSettings"
                  },
                  {
                    "$ref": "#/components/schemas/DevEchoSettings"
                  },
                  {
                    "$ref": "#/components/schemas/DevFlakySettings"
                  },
                  {
                    "$ref": "#/components/schemas/EnrichmentSettings"
                  },
                  {
                    "$ref": "#/components/schemas/ProviderSettings"
                  },
                  {
                    "$ref": "#/components/schemas/HttpApiSettings-Input"
                  },
                  {
                    "$ref": "#/components/schemas/HttpApiJwtSettings-Input"
                  },
                  {
                    "$ref": "#/components/schemas/ReferenceSettings-Input"
                  },
                  {
                    "$ref": "#/components/schemas/ReferencingRowsSettings"
                  },
                  {
                    "$ref": "#/components/schemas/IntegrationLookupSettings"
                  },
                  {
                    "$ref": "#/components/schemas/LinkedInBrowserSettings"
                  },
                  {
                    "$ref": "#/components/schemas/LinkedInCompanyGraphSettings"
                  },
                  {
                    "$ref": "#/components/schemas/SendToTableSettings"
                  },
                  {
                    "$ref": "#/components/schemas/RepDataSettings"
                  },
                  {
                    "$ref": "#/components/schemas/OutreachActivitySettings"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Action-specific configuration; its kind must match the action key. None uses the action's defaults.",
            "title": "Action Settings"
          },
          "kind": {
            "const": "enrichment",
            "default": "enrichment",
            "title": "Kind",
            "type": "string"
          },
          "model_key": {
            "anyOf": [
              {
                "maxLength": 100,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The user-facing model catalog key this column runs on; None uses the action's default model.",
            "title": "Model Key"
          },
          "output": {
            "description": "The declared result shape: named typed fields, or a raw strict-mode JSON schema in the advanced mode. The column's own type derives from it: the single field's type, or a structured object for multi-field outputs.",
            "discriminator": {
              "mapping": {
                "fields": "#/components/schemas/EnrichmentOutputFields-Input",
                "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
              },
              "propertyName": "mode"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnrichmentOutputFields-Input"
              },
              {
                "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
              }
            ],
            "title": "Output"
          },
          "prompt": {
            "$ref": "#/components/schemas/EnrichmentPromptTemplate",
            "description": "The persisted instructions: ordered text and column-reference segments, references stored by column identity so renames never break a prompt."
          }
        },
        "required": [
          "action_key"
        ],
        "title": "EnrichmentColumnDefinition",
        "type": "object"
      },
      "EnrichmentColumnDefinition-Output": {
        "description": "Definition of an enrichment column: an external action run once per row.\n\nThe action is named by its registry key; everything the action needs to run\n(its prompt, model, output shape, settings) grows on this member rather\nthan on the column row, so the definition-version snapshot covers all of\nit.",
        "properties": {
          "action_key": {
            "description": "The enrichment action's registry key; validated against the catalog.",
            "maxLength": 100,
            "minLength": 1,
            "title": "Action Key",
            "type": "string"
          },
          "action_settings": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "agent": "#/components/schemas/AgentSettings",
                    "builtin": "#/components/schemas/BuiltinAgentSettings",
                    "dev_echo": "#/components/schemas/DevEchoSettings",
                    "dev_flaky": "#/components/schemas/DevFlakySettings",
                    "enrichment": "#/components/schemas/EnrichmentSettings",
                    "http_api": "#/components/schemas/HttpApiSettings-Output",
                    "http_api_jwt": "#/components/schemas/HttpApiJwtSettings-Output",
                    "integration_lookup": "#/components/schemas/IntegrationLookupSettings",
                    "linkedin_browser": "#/components/schemas/LinkedInBrowserSettings",
                    "linkedin_company_graph": "#/components/schemas/LinkedInCompanyGraphSettings",
                    "outreach_activity": "#/components/schemas/OutreachActivitySettings",
                    "provider": "#/components/schemas/ProviderSettings",
                    "reference": "#/components/schemas/ReferenceSettings-Output",
                    "referencing_rows": "#/components/schemas/ReferencingRowsSettings",
                    "rep_data": "#/components/schemas/RepDataSettings",
                    "send_to_table": "#/components/schemas/SendToTableSettings",
                    "use_ai": "#/components/schemas/UseAISettings"
                  },
                  "propertyName": "kind"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/UseAISettings"
                  },
                  {
                    "$ref": "#/components/schemas/BuiltinAgentSettings"
                  },
                  {
                    "$ref": "#/components/schemas/AgentSettings"
                  },
                  {
                    "$ref": "#/components/schemas/DevEchoSettings"
                  },
                  {
                    "$ref": "#/components/schemas/DevFlakySettings"
                  },
                  {
                    "$ref": "#/components/schemas/EnrichmentSettings"
                  },
                  {
                    "$ref": "#/components/schemas/ProviderSettings"
                  },
                  {
                    "$ref": "#/components/schemas/HttpApiSettings-Output"
                  },
                  {
                    "$ref": "#/components/schemas/HttpApiJwtSettings-Output"
                  },
                  {
                    "$ref": "#/components/schemas/ReferenceSettings-Output"
                  },
                  {
                    "$ref": "#/components/schemas/ReferencingRowsSettings"
                  },
                  {
                    "$ref": "#/components/schemas/IntegrationLookupSettings"
                  },
                  {
                    "$ref": "#/components/schemas/LinkedInBrowserSettings"
                  },
                  {
                    "$ref": "#/components/schemas/LinkedInCompanyGraphSettings"
                  },
                  {
                    "$ref": "#/components/schemas/SendToTableSettings"
                  },
                  {
                    "$ref": "#/components/schemas/RepDataSettings"
                  },
                  {
                    "$ref": "#/components/schemas/OutreachActivitySettings"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Action-specific configuration; its kind must match the action key. None uses the action's defaults.",
            "title": "Action Settings"
          },
          "kind": {
            "const": "enrichment",
            "default": "enrichment",
            "title": "Kind",
            "type": "string"
          },
          "model_key": {
            "anyOf": [
              {
                "maxLength": 100,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The user-facing model catalog key this column runs on; None uses the action's default model.",
            "title": "Model Key"
          },
          "output": {
            "description": "The declared result shape: named typed fields, or a raw strict-mode JSON schema in the advanced mode. The column's own type derives from it: the single field's type, or a structured object for multi-field outputs.",
            "discriminator": {
              "mapping": {
                "fields": "#/components/schemas/EnrichmentOutputFields-Output",
                "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
              },
              "propertyName": "mode"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnrichmentOutputFields-Output"
              },
              {
                "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
              }
            ],
            "title": "Output"
          },
          "prompt": {
            "$ref": "#/components/schemas/EnrichmentPromptTemplate",
            "description": "The persisted instructions: ordered text and column-reference segments, references stored by column identity so renames never break a prompt."
          }
        },
        "required": [
          "action_key"
        ],
        "title": "EnrichmentColumnDefinition",
        "type": "object"
      },
      "EnrichmentColumnDraftSchema": {
        "description": "A generated draft configuration that seeds the column editor.",
        "properties": {
          "action_key": {
            "title": "Action Key",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "model_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The suggested model; null keeps the catalog default.",
            "title": "Model Key"
          },
          "output": {
            "discriminator": {
              "mapping": {
                "fields": "#/components/schemas/EnrichmentOutputFields-Output",
                "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
              },
              "propertyName": "mode"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnrichmentOutputFields-Output"
              },
              {
                "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
              }
            ],
            "title": "Output"
          },
          "prompt": {
            "$ref": "#/components/schemas/EnrichmentPromptTemplate",
            "description": "The drafted prompt, with references to existing columns."
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "The rows the column runs on when the sentence limited them, such as 'only if Email is empty', in the shape a column's run_condition saves as; null when every row runs."
          },
          "web_research": {
            "description": "Whether the drafted task needs live web research. Always false for actions other than Use AI, which is the only one with a web-research switch to prefill.",
            "title": "Web Research",
            "type": "boolean"
          }
        },
        "required": [
          "display_name",
          "action_key",
          "prompt",
          "output",
          "model_key",
          "web_research",
          "run_condition"
        ],
        "title": "EnrichmentColumnDraftSchema",
        "type": "object"
      },
      "EnrichmentConfiguredContextSchema": {
        "description": "Context for an enrichment column's creation.",
        "properties": {
          "action_key": {
            "title": "Action Key",
            "type": "string"
          },
          "column_display_name": {
            "title": "Column Display Name",
            "type": "string"
          },
          "model_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Key"
          },
          "output_mode": {
            "title": "Output Mode",
            "type": "string"
          },
          "type": {
            "const": "configured",
            "default": "configured",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "column_display_name",
          "action_key",
          "output_mode"
        ],
        "title": "EnrichmentConfiguredContextSchema",
        "type": "object"
      },
      "EnrichmentCostIncurredContextSchema": {
        "description": "Context for a run's settled per-column cost.",
        "properties": {
          "cells_failed": {
            "title": "Cells Failed",
            "type": "integer"
          },
          "cells_no_data": {
            "title": "Cells No Data",
            "type": "integer"
          },
          "cells_skipped": {
            "title": "Cells Skipped",
            "type": "integer"
          },
          "cells_succeeded": {
            "title": "Cells Succeeded",
            "type": "integer"
          },
          "credits_charged": {
            "title": "Credits Charged",
            "type": "number"
          },
          "run_id": {
            "format": "uuid",
            "title": "Run Id",
            "type": "string"
          },
          "run_status": {
            "title": "Run Status",
            "type": "string"
          },
          "type": {
            "const": "cost_incurred",
            "default": "cost_incurred",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "run_id",
          "run_status",
          "credits_charged",
          "cells_succeeded",
          "cells_failed",
          "cells_skipped",
          "cells_no_data"
        ],
        "title": "EnrichmentCostIncurredContextSchema",
        "type": "object"
      },
      "EnrichmentEditedContextSchema": {
        "description": "Context for an enrichment column's edit.",
        "properties": {
          "changes": {
            "items": {
              "$ref": "#/components/schemas/EnrichmentAuditFieldChangeSchema"
            },
            "title": "Changes",
            "type": "array"
          },
          "column_display_name": {
            "title": "Column Display Name",
            "type": "string"
          },
          "type": {
            "const": "edited",
            "default": "edited",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "column_display_name",
          "changes"
        ],
        "title": "EnrichmentEditedContextSchema",
        "type": "object"
      },
      "EnrichmentErrorClass": {
        "description": "Machine-readable classification of a failed enrichment cell.\n\nThe class decides everything downstream: whether the executor retries\n(transient classes) or gives up (terminal ones), what the cell tooltip\nnames, and whether the failure is free. Errors never charge, but only a\nclassified error can prove which kind it was. A clean no-answer (no_data)\nis free for a lookup; an AI column's is charged what it used.",
        "enum": [
          "timeout",
          "rate_limited",
          "quota_exhausted",
          "provider_error",
          "network",
          "schema_violation",
          "refused",
          "invalid_input",
          "no_data",
          "enrichment_failed",
          "sources_unavailable",
          "unexpected"
        ],
        "title": "EnrichmentErrorClass",
        "type": "string"
      },
      "EnrichmentFamily": {
        "description": "The OUTCOME shelf one data enrichment sits on inside the Enrichment tab.\n\nA second axis under :class:`EnrichmentActionCategory`, not a replacement for\nit: the category answers \"what kind of bargain is this\" (a vendor\nwaterfall, a prompt, a free function) and picks the TAB; the family answers\n\"what do I get out of it\" and picks the SHELF within that tab.\n\nIt exists because the catalog is authored by INPUT (five ways to enrich a\nperson differing only in the key you hand them, three ways to enrich a\ncompany, two ways to find a LinkedIn URL) while people browse it by\nOUTCOME. A flat list of sixteen makes the reader derive the grouping\nthemselves from sixteen verb phrases, every time they open the tab.\n\nOrdered as the shelves render. Authored per waterfall in\n``enrichment_catalog.yaml`` beside ``icon`` and ``tagline``, so a new\nwaterfall declares its shelf in the same edit that creates it rather than\nlanding in whichever bucket a frontend map happens to guess.",
        "enum": [
          "email",
          "phone",
          "company",
          "person",
          "social",
          "marketing"
        ],
        "title": "EnrichmentFamily",
        "type": "string"
      },
      "EnrichmentModelSchema": {
        "description": "One user-facing model as the picker and compare view render it.",
        "properties": {
          "best_for": {
            "title": "Best For",
            "type": "string"
          },
          "credits_per_row": {
            "description": "The base: the most one row's AI work costs on this model, in decimal credits. A row is charged what it used, never more.",
            "title": "Credits Per Row",
            "type": "number"
          },
          "description": {
            "description": "One line: the speed/quality trade this tier makes.",
            "title": "Description",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "is_default": {
            "description": "Pre-selected when the column has no stored choice.",
            "title": "Is Default",
            "type": "boolean"
          },
          "is_variable_price": {
            "description": "True marks token-billed models whose estimates are approximate.",
            "title": "Is Variable Price",
            "type": "boolean"
          },
          "key": {
            "description": "The catalog key stored on enrichment column definitions.",
            "title": "Key",
            "type": "string"
          },
          "lookup_credits_per_find": {
            "additionalProperties": {
              "type": "number"
            },
            "description": "What each agent lookup adds to a row when it finds something, keyed 'find_work_email' / 'read_linkedin_profile', in decimal credits. A lookup that is switched on raises the row's maximum by its price; a miss is free.",
            "title": "Lookup Credits Per Find",
            "type": "object"
          },
          "speed": {
            "title": "Speed",
            "type": "string"
          },
          "supported_actions": {
            "description": "The action keys that can run on this model; the picker filters on it and the save path rejects an undeclared pairing.",
            "items": {
              "type": "string"
            },
            "title": "Supported Actions",
            "type": "array"
          },
          "usual_share_without_history": {
            "description": "The share of its per-row maximum a Use AI row on this model that researches (web research on, or a lookup it may buy) is usually charged, for a column with no charged history yet, such as a draft not saved. Multiply the draft's per-row maximum by it for its usual figure. A saved column reads its own from GET /tables/{table_id}/columns/credit-rates/ (usual_credits_per_row). 1.0 means no usual figure.",
            "title": "Usual Share Without History",
            "type": "number"
          },
          "usual_share_without_history_plain": {
            "description": "The same share for a Use AI row on this model that makes one plain model call: web research off and no lookup switched on. Such a row is charged far under its maximum, so a draft like that is quoted at this share, not usual_share_without_history. 1.0 means no usual figure.",
            "title": "Usual Share Without History Plain",
            "type": "number"
          },
          "web_research_credits_per_row": {
            "description": "What turning web research on adds to a row's maximum, in decimal credits.",
            "title": "Web Research Credits Per Row",
            "type": "number"
          }
        },
        "required": [
          "key",
          "display_name",
          "description",
          "credits_per_row",
          "web_research_credits_per_row",
          "lookup_credits_per_find",
          "is_variable_price",
          "speed",
          "best_for",
          "is_default",
          "supported_actions",
          "usual_share_without_history",
          "usual_share_without_history_plain"
        ],
        "title": "EnrichmentModelSchema",
        "type": "object"
      },
      "EnrichmentOutputField": {
        "description": "One named, typed value an enrichment run returns.\n\nField types are drawn from the platform's existing column types, so any\nsingle field can later be promoted into an ordinary typed column without\ninventing a new type system.",
        "properties": {
          "choices": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "maxItems": 200,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The fixed option list for a select field; None elsewhere.",
            "title": "Choices"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shown to the model: what this field should contain.",
            "title": "Description"
          },
          "field_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "default": "text"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "title": "EnrichmentOutputField",
        "type": "object"
      },
      "EnrichmentOutputFields-Input": {
        "description": "The fields-mode output shape: repeatable named typed fields.\n\nThe default is Clay's: one text field named ``response``.",
        "properties": {
          "fields": {
            "items": {
              "$ref": "#/components/schemas/EnrichmentOutputField"
            },
            "maxItems": 50,
            "minItems": 1,
            "title": "Fields",
            "type": "array"
          },
          "mode": {
            "const": "fields",
            "default": "fields",
            "title": "Mode",
            "type": "string"
          }
        },
        "title": "EnrichmentOutputFields",
        "type": "object"
      },
      "EnrichmentOutputFields-Output": {
        "description": "The fields-mode output shape: repeatable named typed fields.\n\nThe default is Clay's: one text field named ``response``.",
        "properties": {
          "fields": {
            "items": {
              "$ref": "#/components/schemas/EnrichmentOutputField"
            },
            "maxItems": 50,
            "minItems": 1,
            "title": "Fields",
            "type": "array"
          },
          "mode": {
            "const": "fields",
            "default": "fields",
            "title": "Mode",
            "type": "string"
          }
        },
        "title": "EnrichmentOutputFields",
        "type": "object"
      },
      "EnrichmentOutputRawSchema": {
        "description": "The advanced output shape: a raw strict-mode JSON schema, verbatim.\n\nHeld to every strict-mode constraint at SAVE time by the service layer.\nThe shape is stored exactly as authored, and validation failures name the\nexact violated rule rather than surfacing at run time.",
        "properties": {
          "json_schema": {
            "additionalProperties": true,
            "description": "A strict-mode JSON schema with an object root.",
            "title": "Json Schema",
            "type": "object"
          },
          "mode": {
            "const": "json_schema",
            "default": "json_schema",
            "title": "Mode",
            "type": "string"
          }
        },
        "required": [
          "json_schema"
        ],
        "title": "EnrichmentOutputRawSchema",
        "type": "object"
      },
      "EnrichmentPromptColumnRefSegment": {
        "description": "An inline reference to another column's per-row value.\n\nStored by column IDENTITY, never by display name, so renaming a column can\nnever change what a prompt means, and a deleted column is detectable\nrather than silently resolving to nothing.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "path": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Dot-separated address of a sub-value inside a structured cell: output field names and zero-based list indices, e.g. 'competitors.0'. None references the whole cell. Emptiness for the required rule is judged on the addressed sub-value.",
            "title": "Path"
          },
          "required": {
            "default": true,
            "description": "Whether a row whose value for this column is empty is skipped entirely instead of run with a blank substituted.",
            "title": "Required",
            "type": "boolean"
          },
          "type": {
            "const": "column_ref",
            "default": "column_ref",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "column_id"
        ],
        "title": "EnrichmentPromptColumnRefSegment",
        "type": "object"
      },
      "EnrichmentPromptTemplate": {
        "description": "The persisted prompt: an ordered mix of text and column references.\n\nResolution to a per-row string happens at run time; the segment list is\nthe single source of truth the editor renders pills from and the executor\nsubstitutes values into.",
        "properties": {
          "format": {
            "default": "plain",
            "description": "How the editor reads text segments: 'markdown' renders them as markdown source, 'plain' verbatim. Templates saved before the field existed carry no value and default to 'plain', the safe reading. Purely editor metadata: run-time resolution concatenates text segments identically either way.",
            "enum": [
              "plain",
              "markdown"
            ],
            "title": "Format",
            "type": "string"
          },
          "segments": {
            "items": {
              "discriminator": {
                "mapping": {
                  "column_ref": "#/components/schemas/EnrichmentPromptColumnRefSegment",
                  "text": "#/components/schemas/EnrichmentPromptTextSegment"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/components/schemas/EnrichmentPromptTextSegment"
                },
                {
                  "$ref": "#/components/schemas/EnrichmentPromptColumnRefSegment"
                }
              ]
            },
            "maxItems": 100,
            "title": "Segments",
            "type": "array"
          }
        },
        "title": "EnrichmentPromptTemplate",
        "type": "object"
      },
      "EnrichmentPromptTextSegment": {
        "description": "A literal run of prompt text.",
        "properties": {
          "text": {
            "maxLength": 20000,
            "title": "Text",
            "type": "string"
          },
          "type": {
            "const": "text",
            "default": "text",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "EnrichmentPromptTextSegment",
        "type": "object"
      },
      "EnrichmentProviderFieldSchema": {
        "description": "One declared input or output field of a provider enrichment operation.",
        "properties": {
          "description": {
            "title": "Description",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "example": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "A sample value shown before anything has run.",
            "title": "Example"
          },
          "name": {
            "description": "The stable field name used in bindings and payloads.",
            "title": "Name",
            "type": "string"
          },
          "required": {
            "description": "Inputs only: the operation cannot run without this field.",
            "title": "Required",
            "type": "boolean"
          },
          "value_kind": {
            "description": "JSON-schema primitive kind ('string', 'integer', 'number', 'boolean', 'array', 'object'). A rendering hint.",
            "title": "Value Kind",
            "type": "string"
          }
        },
        "required": [
          "name",
          "display_name",
          "description",
          "required",
          "value_kind"
        ],
        "title": "EnrichmentProviderFieldSchema",
        "type": "object"
      },
      "EnrichmentProviderOperationSchema": {
        "description": "The provider-side identity of an integration-backed enrichment action.",
        "properties": {
          "inputs": {
            "items": {
              "$ref": "#/components/schemas/EnrichmentProviderFieldSchema"
            },
            "title": "Inputs",
            "type": "array"
          },
          "integration_type": {
            "description": "The integration slug, also the connect-flow integration type.",
            "title": "Integration Type",
            "type": "string"
          },
          "operation_key": {
            "description": "The operation's stable key within the SDK.",
            "title": "Operation Key",
            "type": "string"
          },
          "outputs": {
            "items": {
              "$ref": "#/components/schemas/EnrichmentProviderFieldSchema"
            },
            "title": "Outputs",
            "type": "array"
          },
          "required_input_combinations": {
            "description": "Alternative input sets that each make the operation runnable: a configuration saves when ANY one set is fully bound. The editor renders this as 'needs A + B, or C'.",
            "items": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "title": "Required Input Combinations",
            "type": "array"
          }
        },
        "required": [
          "integration_type",
          "operation_key",
          "inputs",
          "outputs"
        ],
        "title": "EnrichmentProviderOperationSchema",
        "type": "object"
      },
      "EnrichmentRefundRule": {
        "description": "A declarative promise about when a charged cell's credits come back.\n\nDeclared per action so \"you won't be charged when nothing is found\" is a\ncatalog fact the UI can print and a test can enforce, not folklore about\nhow the charge code happens to behave.",
        "enum": [
          "success_no_data",
          "success_blocked_data",
          "success_preview_run"
        ],
        "title": "EnrichmentRefundRule",
        "type": "string"
      },
      "EnrichmentRunCancelledContextSchema": {
        "description": "Context for a run cancellation.",
        "properties": {
          "run_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Run Ids",
            "type": "array"
          },
          "type": {
            "const": "run_cancelled",
            "default": "run_cancelled",
            "title": "Type",
            "type": "string"
          },
          "withdrawn_request_ids": {
            "description": "Runs asked for and not started yet, which the table-wide stop withdrew.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Withdrawn Request Ids",
            "type": "array"
          }
        },
        "required": [
          "run_ids"
        ],
        "title": "EnrichmentRunCancelledContextSchema",
        "type": "object"
      },
      "EnrichmentRunRequestedContextSchema": {
        "description": "Context for a run requested at a given scope.",
        "properties": {
          "column_display_name": {
            "title": "Column Display Name",
            "type": "string"
          },
          "credits_estimated": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Credits Estimated"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Run Id"
          },
          "scope": {
            "title": "Scope",
            "type": "string"
          },
          "type": {
            "const": "run_requested",
            "default": "run_requested",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "column_display_name",
          "scope"
        ],
        "title": "EnrichmentRunRequestedContextSchema",
        "type": "object"
      },
      "EnrichmentRunSourceAttemptSchema": {
        "description": "One attempt inside a curated enrichment, in the order it was made.\n\nPosition and outcome only. A customer can see that four sources were\ntried and the third answered, which is what makes an empty or expensive\ncell explicable, but not WHICH sources, because that is not a fact about\ntheir data.",
        "properties": {
          "attempt_index": {
            "title": "Attempt Index",
            "type": "integer"
          },
          "credits_charged": {
            "description": "The winning attempt's price; zero for every other attempt, and for a winning answer reused from the cache.",
            "title": "Credits Charged",
            "type": "number"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "error_class": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentErrorClass"
              },
              {
                "type": "null"
              }
            ]
          },
          "outcome": {
            "$ref": "#/components/schemas/EnrichmentCellOutcome"
          },
          "served_from_cache": {
            "default": false,
            "description": "Whether the attempt reused an answer an identical earlier lookup in this workspace already paid for, instead of asking a source again. A reused winning answer is free.",
            "title": "Served From Cache",
            "type": "boolean"
          },
          "skipped_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a skipped attempt never ran (e.g. its missing-input message); null for attempts that executed.",
            "title": "Skipped Reason"
          }
        },
        "required": [
          "attempt_index",
          "outcome",
          "error",
          "error_class",
          "credits_charged"
        ],
        "title": "EnrichmentRunSourceAttemptSchema",
        "type": "object"
      },
      "EnrichmentRunSourceSchema": {
        "description": "One source the agent actually read: what, called what, and when.",
        "properties": {
          "fetched_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the agent read it; null on records that predate it.",
            "title": "Fetched At"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          },
          "url": {
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "url",
          "title",
          "fetched_at"
        ],
        "title": "EnrichmentRunSourceSchema",
        "type": "object"
      },
      "EnrichmentRunStepSchema": {
        "description": "One agent step as the inspection drawer renders it.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/AgentStepAction"
          },
          "detail": {
            "description": "The search query or fetched URL.",
            "title": "Detail",
            "type": "string"
          },
          "duration_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How long the step took; null on records that predate timing.",
            "title": "Duration Ms"
          },
          "observation": {
            "description": "One line on what came back.",
            "title": "Observation",
            "type": "string"
          },
          "outcome": {
            "$ref": "#/components/schemas/AgentStepOutcome",
            "description": "How the step ended: completed, failed, or refused."
          },
          "thought": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model's stated reasoning for this step; null on records that predate thoughts.",
            "title": "Thought"
          }
        },
        "required": [
          "action",
          "detail",
          "observation",
          "duration_ms",
          "outcome"
        ],
        "title": "EnrichmentRunStepSchema",
        "type": "object"
      },
      "EnrichmentSettings": {
        "description": "Settings for a curated enrichment: which columns supply which facts.\n\nThe whole configuration of an enrichment column, and deliberately tiny.\nIts predecessor stored the entire fallback chain here: an ordered list of\nvendor operations, each with its own input mapping, assembled by the\ncustomer in the editor. That made the supply chain part of the customer's\ndata: visible in the API, editable by hand, and frozen at the moment they\nsaved it, so improving a chain meant migrating every column that had\ncopied it.\n\nNow the chain lives in the catalog and is resolved per run. A column\nstores only the outcome it wants (the action key) and where its inputs\ncome from, keyed by CANONICAL name (``full_name``, ``company_domain``),\nnever by whatever the vendor at the front of today's chain happens to call\nthem. Adding a supplier, reordering the chain or renaming a vendor's field\nchanges nothing here.",
        "properties": {
          "input_bindings": {
            "additionalProperties": {
              "format": "uuid",
              "type": "string"
            },
            "description": "Canonical input name \u2192 the column that supplies it.",
            "maxProperties": 10,
            "title": "Input Bindings",
            "type": "object"
          },
          "kind": {
            "const": "enrichment",
            "default": "enrichment",
            "title": "Kind",
            "type": "string"
          },
          "second_check": {
            "default": false,
            "description": "Whether an answer the enrichment marks as worth a second look (Verify email's catch-all) goes on to the next supplier instead of ending the lookup. Kept when no later supplier gives a definite answer. A second check that answers is charged as one more lookup. Only offered where the enrichment has such answers.",
            "title": "Second Check",
            "type": "boolean"
          }
        },
        "title": "EnrichmentSettings",
        "type": "object"
      },
      "EnrolRowsRequestSchema": {
        "description": "The rows an Add to sequence reaches, and the sequence they join.\n\nSend ``record_ids`` to add a checkbox selection. Send ``all: true`` to add\nevery row the current listing matches, optionally narrowed by\n``where``/``row_status``, exactly the predicate vocabulary of the rows\nquery. The explicit flag exists so an accidentally empty body adds nobody.",
        "properties": {
          "all": {
            "default": false,
            "description": "Add every matching row rather than a named set. Required (and only honoured) when record_ids is absent.",
            "title": "All",
            "type": "boolean"
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Record IDs of the grid rows to add.",
            "title": "Record Ids"
          },
          "row_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Narrow an `all` selection to errored or fully computed rows."
          },
          "sequence_id": {
            "description": "The sequence the rows join.",
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "Narrow an `all` selection to rows matching this predicate tree."
          }
        },
        "required": [
          "sequence_id"
        ],
        "title": "EnrolRowsRequestSchema",
        "type": "object"
      },
      "EnrolRowsResponseSchema": {
        "description": "How many of the rows joined the sequence; the rest were skipped.",
        "properties": {
          "updated": {
            "description": "How many rows became contacts. Rows already enrolled, without an address the sequence uses, on the do-not-contact list or held by another live sequence are skipped.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated"
        ],
        "title": "EnrolRowsResponseSchema",
        "type": "object"
      },
      "EnrolmentDetailReadSchema": {
        "description": "One contact of a sequence as their row lists them, with what their audience row says.",
        "properties": {
          "bounced": {
            "title": "Bounced",
            "type": "boolean"
          },
          "browser_outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContactBrowserOutcomeReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The outcome the contact's latest settled Browser use run of this journey took, as the run settled on it: the Audience tab's Outcome column. Null until a run of theirs settles on one."
          },
          "company_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Key"
          },
          "contact_company": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their company, from whichever column of the audience row holds one.",
            "title": "Contact Company"
          },
          "contact_fields": {
            "description": "Every filled column of the contact's audience row, in the table's order, as the approval queue shows them. Empty when there is no row to read.",
            "items": {
              "$ref": "#/components/schemas/ContactFieldReadSchema"
            },
            "title": "Contact Fields",
            "type": "array"
          },
          "contact_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The person's name from their audience row: a full-name column where filled, else the given and family names joined. Null when the table names nobody.",
            "title": "Contact Name"
          },
          "contact_number": {
            "default": 0,
            "description": "This contact's ordinal within the sequence, from 1. A label of last resort, for a contact with neither an address nor a LinkedIn profile.",
            "title": "Contact Number",
            "type": "integer"
          },
          "contact_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their job title, from whichever column of the audience row holds one.",
            "title": "Contact Title"
          },
          "cooldown_by_sequence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HeldBySequenceReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a contact the cooldown stopped (stop_reason cooldown): the other sequence of this workspace whose touch at last_contacted_at the stop is measured from. Null when that touch is older than the clock knowing its sequence, or the sequence is gone or in Trash."
          },
          "cooldown_starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a contact who starts on their own does, on a running sequence: the day the cooldown ends, or now once it has. Null on a paused sequence, where they start when it resumes, and for anyone who waits for a person.",
            "title": "Cooldown Starts At"
          },
          "cooldown_starts_by_itself": {
            "default": false,
            "description": "On a contact the cooldown stopped: true when they start on their own once it ends (this sequence is running or paused, nothing it sent reached them, and nothing else keeps them stopped). False means they stay stopped until a person resumes them.",
            "title": "Cooldown Starts By Itself",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "current_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Current Step Id"
          },
          "decides_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a contact on a condition that waits (Email bounced?, or an older Replied? or Accepted? check), or waiting for a connection request's answer: when the branch is decided. On a request it is when its answer window closes; in the past, the window is over and one more reading decides.",
            "title": "Decides At"
          },
          "due_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Due At"
          },
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "failure_code": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrolmentFailureCode"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which kind of failure stopped a failed contact, where it changes what Retry does: connected_before_withdraw (a Withdraw found them already connected; nothing to retry, so no Retry is offered) or invite_look_unreadable (the look at their profile could not tell whether they accepted; Retry looks again), or missing_values (a Browser use step's goal reads a value their row has none for, so it never ran and charged nothing; Retry runs it once the value is filled in, and leaves them failed while it is empty: see missing_values). Null for every other failure and status."
          },
          "failure_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a failed contact stopped, in a sentence: for a LinkedIn step, the browser's own reason. The status cell says only Failed; this is the why. Retry runs the same step again. Null on every other status.",
            "title": "Failure Reason"
          },
          "held_by_sequence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HeldBySequenceReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a contact skipped because they are in another live sequence (status skipped_duplicate): that sequence of this workspace, by id and name. Null for every other status, and once nothing holds the contact, which is when the next sync takes them in."
          },
          "hold_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HoldReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the send path pushed this contact's next attempt out to due_at. Set only on an active contact whose due_at is still ahead. 'window' also covers a contact due on one of the sending window's openings, whoever scheduled them."
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "invited_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the connection request this contact stands on went out, or was first seen already pending: set while they wait for its answer (and kept through a pause or a stop). Null on every other step, and on a completed contact.",
            "title": "Invited At"
          },
          "last_contacted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The touch a cooldown stop is measured from. The sequence that made it is cooldown_by_sequence.",
            "title": "Last Contacted At"
          },
          "last_step_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When that step ran.",
            "title": "Last Step At"
          },
          "last_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step this contact last actually ran. Not the step before current_step_id: on a branching graph those are different steps.",
            "title": "Last Step Id"
          },
          "linkedin_queue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInQueueState"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set beside waiting_on 'linkedin': where the contact's step stands in the sending account's line. 'running' is in a browser now; 'queued' is in line (see linkedin_steps_ahead and linkedin_starts_at); the rest say why the line is not moving for it: the sequence's sending hours shut in the sender's timezone ('outside_window'), a daily or weekly limit for its kind, no browser checked in for fifteen minutes, LinkedIn asking to verify the account, or the account disconnected."
          },
          "linkedin_resets_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a step held by a daily or weekly limit, when the limit it waits on resets (midnight in the sender's timezone). Null otherwise.",
            "title": "Linkedin Resets At"
          },
          "linkedin_starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the step is expected to start, simulated the way the account's governor hands steps out: the next gap is exact, later gaps are the account's time between steps widened by the average jitter, and a step held by a daily or weekly limit starts after that limit resets. Null where no time can be named.",
            "title": "Linkedin Starts At"
          },
          "linkedin_steps_ahead": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a queued step, how many of the account's steps run before it.",
            "title": "Linkedin Steps Ahead"
          },
          "linkedin_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Url"
          },
          "mailbox_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The address this contact is emailed from. A contact is only ever emailed from the mailbox that first emailed them, in any sequence. Null until something has emailed them.",
            "title": "Mailbox Address"
          },
          "mailbox_issue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MailboxIssue"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why that mailbox cannot send for this sequence, set while it is what stops the contact (stop_reason mailbox_removed: deleted, not_on_sequence) or holds them (hold_reason mailbox_waiting: disconnected, no_sender)."
          },
          "missing_values": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a contact failed with failure_code missing_values: the values their Browser use step's goal reads that are still empty on their row now, in the goal's order. Empty once all are filled in, when Retry runs the step. Null for every other contact.",
            "title": "Missing Values"
          },
          "reachable": {
            "default": true,
            "description": "Whether any channel this sequence's steps use can reach the contact: an email address for an email step, a LinkedIn profile URL for a LinkedIn one. A sequence with no sending step yet counts both.",
            "title": "Reachable",
            "type": "boolean"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "replied_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Replied At"
          },
          "row_deleted": {
            "default": false,
            "description": "The contact's row is no longer on the audience table: it was deleted. A contact who Left the audience with this false left the view the sequence follows instead.",
            "title": "Row Deleted",
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/EnrolmentStatus"
          },
          "status_word": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's status in the one word every surface says it in, as the Audience tab's chip reads: Not started, In progress, Scheduled, Daily limit, Weekly limit, Waiting for reply, Waiting for acceptance, Queued to write, Queued for approval, Writing, Writing delayed, Verifying email, Waiting for browser, Browsing, Browser unavailable, Approved, Limit at zero, No mailbox, No message, Browser offline, Verify account, LinkedIn disconnected, Needs approval, Paused, Finished, Replied, Said no, Unsubscribed, Stopped, Left the audience, Removed, Step deleted, Rejected, Stopped in Trash, Already connected, Bounced, In cooldown, Mailbox removed, Couldn't read reply, Failed, Do not contact, In another sequence or Unreachable. Why it stands so is failure_reason, never this word. Set on the roster's list read; null on a read that did not judge it.",
            "title": "Status Word"
          },
          "stop_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StopReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "unreachable_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UnreachableReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which address the contact lacks, set only while being unreachable is what holds them: the Contacts tab reads it as Unreachable, and the audience eligibility counts them under missing_contact_details. Null for a reachable contact and for one who is settled or held by something named first (do not contact, another sequence, a cooldown)."
          },
          "upcoming_skip": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UpcomingSkipReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step the contact waits on, when their row as it is today means it will be skipped once they reach it, and why. Null when it will run, or when nothing is ahead of them."
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "waiting_on": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WaitingOn"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the approval queue holds this contact behind, read from the task for their current step: a person's approval, a LinkedIn browser, or an approved email the engine has not sent yet. Null when nothing does."
          }
        },
        "required": [
          "id",
          "record_id",
          "email",
          "status",
          "current_step_id",
          "due_at",
          "stop_reason",
          "bounced",
          "replied_at",
          "company_key",
          "created_at",
          "updated_at",
          "contact_fields"
        ],
        "title": "EnrolmentDetailReadSchema",
        "type": "object"
      },
      "EnrolmentFailureCode": {
        "description": "Which kind of failure stopped a FAILED contact, where the product treats one differently.\n\nStored beside ``failure_reason`` and cleared with it. Most failures carry\nno code: Retry runs the step that broke again. ``CONNECTED_BEFORE_WITHDRAW``\nis a Withdraw that found the person already connected: there is nothing\nto withdraw and nothing to retry, so no Retry offers it.\n``INVITE_LOOK_UNREADABLE`` is the profile look a connection request queued\nto learn its answer, which could not read the relationship: Retry queues\na fresh look rather than sending the request again. ``MISSING_VALUES`` is a\nBrowser use step the contact lacked a value for.",
        "enum": [
          "connected_before_withdraw",
          "invite_look_unreadable",
          "missing_values"
        ],
        "title": "EnrolmentFailureCode",
        "type": "string"
      },
      "EnrolmentReadSchema": {
        "properties": {
          "bounced": {
            "title": "Bounced",
            "type": "boolean"
          },
          "browser_outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContactBrowserOutcomeReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The outcome the contact's latest settled Browser use run of this journey took, as the run settled on it: the Audience tab's Outcome column. Null until a run of theirs settles on one."
          },
          "company_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Key"
          },
          "contact_company": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their company, from whichever column of the audience row holds one.",
            "title": "Contact Company"
          },
          "contact_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The person's name from their audience row: a full-name column where filled, else the given and family names joined. Null when the table names nobody.",
            "title": "Contact Name"
          },
          "contact_number": {
            "default": 0,
            "description": "This contact's ordinal within the sequence, from 1. A label of last resort, for a contact with neither an address nor a LinkedIn profile.",
            "title": "Contact Number",
            "type": "integer"
          },
          "contact_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their job title, from whichever column of the audience row holds one.",
            "title": "Contact Title"
          },
          "cooldown_by_sequence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HeldBySequenceReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a contact the cooldown stopped (stop_reason cooldown): the other sequence of this workspace whose touch at last_contacted_at the stop is measured from. Null when that touch is older than the clock knowing its sequence, or the sequence is gone or in Trash."
          },
          "cooldown_starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a contact who starts on their own does, on a running sequence: the day the cooldown ends, or now once it has. Null on a paused sequence, where they start when it resumes, and for anyone who waits for a person.",
            "title": "Cooldown Starts At"
          },
          "cooldown_starts_by_itself": {
            "default": false,
            "description": "On a contact the cooldown stopped: true when they start on their own once it ends (this sequence is running or paused, nothing it sent reached them, and nothing else keeps them stopped). False means they stay stopped until a person resumes them.",
            "title": "Cooldown Starts By Itself",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "current_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Current Step Id"
          },
          "decides_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a contact on a condition that waits (Email bounced?, or an older Replied? or Accepted? check), or waiting for a connection request's answer: when the branch is decided. On a request it is when its answer window closes; in the past, the window is over and one more reading decides.",
            "title": "Decides At"
          },
          "due_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Due At"
          },
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "failure_code": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrolmentFailureCode"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which kind of failure stopped a failed contact, where it changes what Retry does: connected_before_withdraw (a Withdraw found them already connected; nothing to retry, so no Retry is offered) or invite_look_unreadable (the look at their profile could not tell whether they accepted; Retry looks again), or missing_values (a Browser use step's goal reads a value their row has none for, so it never ran and charged nothing; Retry runs it once the value is filled in, and leaves them failed while it is empty: see missing_values). Null for every other failure and status."
          },
          "failure_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a failed contact stopped, in a sentence: for a LinkedIn step, the browser's own reason. The status cell says only Failed; this is the why. Retry runs the same step again. Null on every other status.",
            "title": "Failure Reason"
          },
          "held_by_sequence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HeldBySequenceReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a contact skipped because they are in another live sequence (status skipped_duplicate): that sequence of this workspace, by id and name. Null for every other status, and once nothing holds the contact, which is when the next sync takes them in."
          },
          "hold_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HoldReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the send path pushed this contact's next attempt out to due_at. Set only on an active contact whose due_at is still ahead. 'window' also covers a contact due on one of the sending window's openings, whoever scheduled them."
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "invited_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the connection request this contact stands on went out, or was first seen already pending: set while they wait for its answer (and kept through a pause or a stop). Null on every other step, and on a completed contact.",
            "title": "Invited At"
          },
          "last_contacted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The touch a cooldown stop is measured from. The sequence that made it is cooldown_by_sequence.",
            "title": "Last Contacted At"
          },
          "last_step_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When that step ran.",
            "title": "Last Step At"
          },
          "last_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step this contact last actually ran. Not the step before current_step_id: on a branching graph those are different steps.",
            "title": "Last Step Id"
          },
          "linkedin_queue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInQueueState"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set beside waiting_on 'linkedin': where the contact's step stands in the sending account's line. 'running' is in a browser now; 'queued' is in line (see linkedin_steps_ahead and linkedin_starts_at); the rest say why the line is not moving for it: the sequence's sending hours shut in the sender's timezone ('outside_window'), a daily or weekly limit for its kind, no browser checked in for fifteen minutes, LinkedIn asking to verify the account, or the account disconnected."
          },
          "linkedin_resets_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a step held by a daily or weekly limit, when the limit it waits on resets (midnight in the sender's timezone). Null otherwise.",
            "title": "Linkedin Resets At"
          },
          "linkedin_starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the step is expected to start, simulated the way the account's governor hands steps out: the next gap is exact, later gaps are the account's time between steps widened by the average jitter, and a step held by a daily or weekly limit starts after that limit resets. Null where no time can be named.",
            "title": "Linkedin Starts At"
          },
          "linkedin_steps_ahead": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a queued step, how many of the account's steps run before it.",
            "title": "Linkedin Steps Ahead"
          },
          "linkedin_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Url"
          },
          "mailbox_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The address this contact is emailed from. A contact is only ever emailed from the mailbox that first emailed them, in any sequence. Null until something has emailed them.",
            "title": "Mailbox Address"
          },
          "mailbox_issue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MailboxIssue"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why that mailbox cannot send for this sequence, set while it is what stops the contact (stop_reason mailbox_removed: deleted, not_on_sequence) or holds them (hold_reason mailbox_waiting: disconnected, no_sender)."
          },
          "missing_values": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a contact failed with failure_code missing_values: the values their Browser use step's goal reads that are still empty on their row now, in the goal's order. Empty once all are filled in, when Retry runs the step. Null for every other contact.",
            "title": "Missing Values"
          },
          "reachable": {
            "default": true,
            "description": "Whether any channel this sequence's steps use can reach the contact: an email address for an email step, a LinkedIn profile URL for a LinkedIn one. A sequence with no sending step yet counts both.",
            "title": "Reachable",
            "type": "boolean"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "replied_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Replied At"
          },
          "row_deleted": {
            "default": false,
            "description": "The contact's row is no longer on the audience table: it was deleted. A contact who Left the audience with this false left the view the sequence follows instead.",
            "title": "Row Deleted",
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/EnrolmentStatus"
          },
          "status_word": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's status in the one word every surface says it in, as the Audience tab's chip reads: Not started, In progress, Scheduled, Daily limit, Weekly limit, Waiting for reply, Waiting for acceptance, Queued to write, Queued for approval, Writing, Writing delayed, Verifying email, Waiting for browser, Browsing, Browser unavailable, Approved, Limit at zero, No mailbox, No message, Browser offline, Verify account, LinkedIn disconnected, Needs approval, Paused, Finished, Replied, Said no, Unsubscribed, Stopped, Left the audience, Removed, Step deleted, Rejected, Stopped in Trash, Already connected, Bounced, In cooldown, Mailbox removed, Couldn't read reply, Failed, Do not contact, In another sequence or Unreachable. Why it stands so is failure_reason, never this word. Set on the roster's list read; null on a read that did not judge it.",
            "title": "Status Word"
          },
          "stop_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StopReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "unreachable_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UnreachableReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which address the contact lacks, set only while being unreachable is what holds them: the Contacts tab reads it as Unreachable, and the audience eligibility counts them under missing_contact_details. Null for a reachable contact and for one who is settled or held by something named first (do not contact, another sequence, a cooldown)."
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "waiting_on": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WaitingOn"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the approval queue holds this contact behind, read from the task for their current step: a person's approval, a LinkedIn browser, or an approved email the engine has not sent yet. Null when nothing does."
          }
        },
        "required": [
          "id",
          "record_id",
          "email",
          "status",
          "current_step_id",
          "due_at",
          "stop_reason",
          "bounced",
          "replied_at",
          "company_key",
          "created_at",
          "updated_at"
        ],
        "title": "EnrolmentReadSchema",
        "type": "object"
      },
      "EnrolmentStatus": {
        "description": "Where one contact stands in one sequence.\n\nACTIVE rows carry a ``due_at`` and are what the tick claims; CLAIMED is the\nin-flight guard between claim and outcome. PAUSED is a deliberate\nper-contact hold: unclaimable because the tick claims strictly on ACTIVE,\nyet still LIVE. It keeps its step and its one-live-sequence slot, and a\ncompliance stop (reply, unsubscribe) reaches it. Everything else is\nsettled: COMPLETED walked off the end; STOPPED was halted (reply,\nunsubscribe, bounce, manual, company pause); FAILED is terminal;\nSUPPRESSED was on the do-not-contact list;\nSKIPPED_DUPLICATE lost the one-live-sequence-per-contact rule, with the\nreason visible in the grid.\n\nA contact the workspace's recontact rule refuses is STOPPED with\n``StopReason.COOLDOWN``. There is deliberately no held state: a cooldown\nsettles a contact rather than parking them, so nothing here waits on a date\nand nothing lets itself out later.\n\nAWAITING_ACTION is a contact parked behind a task that needs a\nperson or a channel, modelled on PAUSED: live, keeps its step and its\none-live-sequence slot, unclaimable because the tick claims strictly on\nACTIVE, and a compliance stop reaches it. Unlike PAUSED nobody wakes it by\nhand: only the outreach-task sweep does, once the task it waits on is\ndecided or delivered. Deliberately not \"awaiting approval\": an AUTO-mode\nLinkedIn park is waiting for a browser rather than for anyone's approval,\nand this value is the word the Contacts tab shows for both.\n\nPENDING is a draft's roster: in, standing on a step, and NOT live. Binding\nan audience enrols on the spot so the Contacts tab can show who is in, but\na sequence nobody has launched must not hold anybody's one-live-sequence\nslot, or a second sequence written for the same people skips them all.\n``uq_sequence_enrolment_one_live`` leaves PENDING out, the tick never\nclaims it, and launch turns each row ACTIVE, settling the ones another\nsequence took meanwhile as SKIPPED_DUPLICATE.",
        "enum": [
          "pending",
          "active",
          "claimed",
          "paused",
          "awaiting_action",
          "completed",
          "stopped",
          "failed",
          "suppressed",
          "skipped_duplicate"
        ],
        "title": "EnrolmentStatus",
        "type": "string"
      },
      "ExecutiveChangeWindow": {
        "description": "How recently an executive joined or left a company, as a company search asks it.\n\nNo week: the index dates a leadership change to the month.",
        "enum": [
          "past_month",
          "past_quarter",
          "past_year"
        ],
        "title": "ExecutiveChangeWindow",
        "type": "string"
      },
      "ExportColumnDefinition-Input": {
        "description": "Definition of an export column: one row pushed to a connected destination.\n\nThe cell holds the RECEIPT of that push (status, the destination record\nid, when it happened), never the row's own data (see\n``TableColumnKind.EXPORT``). The destination integration is named by id\nplus a denormalized ``integration_type``, for the same reason\n``table_import_integration`` denormalizes it: rendering a column must not need a join\ninto the integration stratum.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/ExportWriteAction",
            "default": "upsert"
          },
          "batched": {
            "default": false,
            "description": "Write rows in destination-sized batches instead of one at a time. Faster, at a cost: the destination reports batch-level results, so receipts say 'pushed' rather than created-versus-updated, and a burst of writes can overwhelm automations attached to the destination. Off by default for that reason.",
            "title": "Batched",
            "type": "boolean"
          },
          "fields": {
            "description": "The destination properties written, in mapping order.",
            "items": {
              "$ref": "#/components/schemas/ExportFieldMapping-Input"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Fields",
            "type": "array"
          },
          "identity": {
            "description": "The destination fields the row may be identified by: the match key that decides create-versus-update, required for every action. More than one is an ordered FALLBACK, not a composite key: the first entry that renders a non-empty value for a row is the one that row is matched on, and the rest are not consulted. Order them most to least trustworthy ('match on work email, failing that personal email'). Matching on two fields at once is not offered because the destination contract takes a single identity field.",
            "items": {
              "$ref": "#/components/schemas/ExportIdentityMapping-Input"
            },
            "maxItems": 4,
            "title": "Identity",
            "type": "array"
          },
          "integration_id": {
            "description": "The connected DESTINATION integration this column writes to.",
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          },
          "integration_type": {
            "description": "Provider slug, denormalized so display needs no cross-stratum join.",
            "maxLength": 100,
            "minLength": 1,
            "title": "Integration Type",
            "type": "string"
          },
          "kind": {
            "const": "export",
            "default": "export",
            "title": "Kind",
            "type": "string"
          },
          "only_on_change": {
            "default": true,
            "description": "Skip a row whose outgoing payload is identical to the one last successfully written. The row-level idempotency knob; off, every run re-writes every row.",
            "title": "Only On Change",
            "type": "boolean"
          },
          "record_type": {
            "description": "Which destination object to write: 'contacts', 'deals', a custom type.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Record Type",
            "type": "string"
          },
          "remove_blanks": {
            "default": true,
            "description": "Drop fields whose rendered value is empty from the outgoing payload rather than sending a blank. Off, a blank clears the destination value: a deliberate act, not a default.",
            "title": "Remove Blanks",
            "type": "boolean"
          },
          "retry": {
            "$ref": "#/components/schemas/ExportRetryPolicy",
            "description": "Retry, timeout and rate-limit behaviour for this column's writes."
          },
          "typecast": {
            "default": true,
            "description": "Coerce each rendered value into the destination property's declared type before writing. Off, values are sent verbatim and the destination's own coercion applies.",
            "title": "Typecast",
            "type": "boolean"
          },
          "update_mode": {
            "default": "patch",
            "description": "replace overwrites the whole record, patch touches only the mapped fields, set_once writes only where the destination is empty. Degrades to patch at run time when the destination does not declare replace, the same fallback the sync export makes.",
            "enum": [
              "replace",
              "patch",
              "set_once"
            ],
            "title": "Update Mode",
            "type": "string"
          }
        },
        "required": [
          "integration_id",
          "integration_type",
          "record_type",
          "fields"
        ],
        "title": "ExportColumnDefinition",
        "type": "object"
      },
      "ExportColumnDefinition-Output": {
        "description": "Definition of an export column: one row pushed to a connected destination.\n\nThe cell holds the RECEIPT of that push (status, the destination record\nid, when it happened), never the row's own data (see\n``TableColumnKind.EXPORT``). The destination integration is named by id\nplus a denormalized ``integration_type``, for the same reason\n``table_import_integration`` denormalizes it: rendering a column must not need a join\ninto the integration stratum.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/ExportWriteAction",
            "default": "upsert"
          },
          "batched": {
            "default": false,
            "description": "Write rows in destination-sized batches instead of one at a time. Faster, at a cost: the destination reports batch-level results, so receipts say 'pushed' rather than created-versus-updated, and a burst of writes can overwhelm automations attached to the destination. Off by default for that reason.",
            "title": "Batched",
            "type": "boolean"
          },
          "fields": {
            "description": "The destination properties written, in mapping order.",
            "items": {
              "$ref": "#/components/schemas/ExportFieldMapping-Output"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Fields",
            "type": "array"
          },
          "identity": {
            "description": "The destination fields the row may be identified by: the match key that decides create-versus-update, required for every action. More than one is an ordered FALLBACK, not a composite key: the first entry that renders a non-empty value for a row is the one that row is matched on, and the rest are not consulted. Order them most to least trustworthy ('match on work email, failing that personal email'). Matching on two fields at once is not offered because the destination contract takes a single identity field.",
            "items": {
              "$ref": "#/components/schemas/ExportIdentityMapping-Output"
            },
            "maxItems": 4,
            "title": "Identity",
            "type": "array"
          },
          "integration_id": {
            "description": "The connected DESTINATION integration this column writes to.",
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          },
          "integration_type": {
            "description": "Provider slug, denormalized so display needs no cross-stratum join.",
            "maxLength": 100,
            "minLength": 1,
            "title": "Integration Type",
            "type": "string"
          },
          "kind": {
            "const": "export",
            "default": "export",
            "title": "Kind",
            "type": "string"
          },
          "only_on_change": {
            "default": true,
            "description": "Skip a row whose outgoing payload is identical to the one last successfully written. The row-level idempotency knob; off, every run re-writes every row.",
            "title": "Only On Change",
            "type": "boolean"
          },
          "record_type": {
            "description": "Which destination object to write: 'contacts', 'deals', a custom type.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Record Type",
            "type": "string"
          },
          "remove_blanks": {
            "default": true,
            "description": "Drop fields whose rendered value is empty from the outgoing payload rather than sending a blank. Off, a blank clears the destination value: a deliberate act, not a default.",
            "title": "Remove Blanks",
            "type": "boolean"
          },
          "retry": {
            "$ref": "#/components/schemas/ExportRetryPolicy",
            "description": "Retry, timeout and rate-limit behaviour for this column's writes."
          },
          "typecast": {
            "default": true,
            "description": "Coerce each rendered value into the destination property's declared type before writing. Off, values are sent verbatim and the destination's own coercion applies.",
            "title": "Typecast",
            "type": "boolean"
          },
          "update_mode": {
            "default": "patch",
            "description": "replace overwrites the whole record, patch touches only the mapped fields, set_once writes only where the destination is empty. Degrades to patch at run time when the destination does not declare replace, the same fallback the sync export makes.",
            "enum": [
              "replace",
              "patch",
              "set_once"
            ],
            "title": "Update Mode",
            "type": "string"
          }
        },
        "required": [
          "integration_id",
          "integration_type",
          "record_type",
          "fields"
        ],
        "title": "ExportColumnDefinition",
        "type": "object"
      },
      "ExportConfiguredContextSchema": {
        "description": "Context for an export column's creation or reconfiguration.",
        "properties": {
          "batched": {
            "default": false,
            "title": "Batched",
            "type": "boolean"
          },
          "column_display_name": {
            "default": "",
            "title": "Column Display Name",
            "type": "string"
          },
          "export_action": {
            "default": "",
            "title": "Export Action",
            "type": "string"
          },
          "integration_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Integration Id"
          },
          "integration_type": {
            "default": "",
            "title": "Integration Type",
            "type": "string"
          },
          "record_type": {
            "default": "",
            "title": "Record Type",
            "type": "string"
          },
          "type": {
            "const": "export_configured",
            "default": "export_configured",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "ExportConfiguredContextSchema",
        "type": "object"
      },
      "ExportFieldMapping-Input": {
        "description": "One destination property and where its value comes from.",
        "properties": {
          "destination_field": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Destination Field",
            "type": "string"
          },
          "property_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PropertyType"
              },
              {
                "type": "null"
              }
            ],
            "description": "The type the rendered value is coerced to before it is written, when the definition's ``typecast`` is on. It never creates the property: an export writes only to fields the destination already has. None means the destination's own type is authoritative and the value is sent as rendered."
          },
          "skip_if_blank": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Per-field override of the definition's ``remove_blanks``; None inherits it. Set False on one field to send an explicit blank that clears a destination value.",
            "title": "Skip If Blank"
          },
          "source": {
            "$ref": "#/components/schemas/ExportValueSource-Input"
          }
        },
        "required": [
          "destination_field",
          "source"
        ],
        "title": "ExportFieldMapping",
        "type": "object"
      },
      "ExportFieldMapping-Output": {
        "description": "One destination property and where its value comes from.",
        "properties": {
          "destination_field": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Destination Field",
            "type": "string"
          },
          "property_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PropertyType"
              },
              {
                "type": "null"
              }
            ],
            "description": "The type the rendered value is coerced to before it is written, when the definition's ``typecast`` is on. It never creates the property: an export writes only to fields the destination already has. None means the destination's own type is authoritative and the value is sent as rendered."
          },
          "skip_if_blank": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Per-field override of the definition's ``remove_blanks``; None inherits it. Set False on one field to send an explicit blank that clears a destination value.",
            "title": "Skip If Blank"
          },
          "source": {
            "$ref": "#/components/schemas/ExportValueSource-Output"
          }
        },
        "required": [
          "destination_field",
          "source"
        ],
        "title": "ExportFieldMapping",
        "type": "object"
      },
      "ExportFileDownloadedContextSchema": {
        "description": "Context for a table's file download.",
        "properties": {
          "filename": {
            "default": "",
            "title": "Filename",
            "type": "string"
          },
          "format": {
            "default": "csv",
            "title": "Format",
            "type": "string"
          },
          "scope": {
            "default": "",
            "title": "Scope",
            "type": "string"
          },
          "table_display_name": {
            "default": "",
            "title": "Table Display Name",
            "type": "string"
          },
          "type": {
            "const": "file_exported",
            "default": "file_exported",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "ExportFileDownloadedContextSchema",
        "type": "object"
      },
      "ExportIdentityMapping-Input": {
        "description": "One destination field the row may be IDENTIFIED by.\n\nDistinct from ``fields`` because identity is not written the way a\nproperty is: it selects the record for update/upsert, and it is what a\ncreate-only column matches on to avoid making a second copy. A row whose\nidentity renders empty is SKIPPED, never written. An unidentifiable row\nis the case the skip exists for.\n\nSeveral of these form an ordered FALLBACK, not a composite key: see\n``ExportColumnDefinition.identity``.",
        "properties": {
          "destination_field": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Destination Field",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/ExportValueSource-Input"
          }
        },
        "required": [
          "destination_field",
          "source"
        ],
        "title": "ExportIdentityMapping",
        "type": "object"
      },
      "ExportIdentityMapping-Output": {
        "description": "One destination field the row may be IDENTIFIED by.\n\nDistinct from ``fields`` because identity is not written the way a\nproperty is: it selects the record for update/upsert, and it is what a\ncreate-only column matches on to avoid making a second copy. A row whose\nidentity renders empty is SKIPPED, never written. An unidentifiable row\nis the case the skip exists for.\n\nSeveral of these form an ordered FALLBACK, not a composite key: see\n``ExportColumnDefinition.identity``.",
        "properties": {
          "destination_field": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Destination Field",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/ExportValueSource-Output"
          }
        },
        "required": [
          "destination_field",
          "source"
        ],
        "title": "ExportIdentityMapping",
        "type": "object"
      },
      "ExportPreviewRequestSchema": {
        "description": "A dry run: render an export against real rows, write nothing.",
        "properties": {
          "definition": {
            "$ref": "#/components/schemas/ExportColumnDefinition-Input",
            "description": "The export definition to preview, passed inline so the editor can preview BEFORE the column exists."
          },
          "record_ids": {
            "description": "The rows to preview; the server caps how many render.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 25,
            "minItems": 1,
            "title": "Record Ids",
            "type": "array"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "definition",
          "record_ids"
        ],
        "title": "ExportPreviewRequestSchema",
        "type": "object"
      },
      "ExportPreviewResponseSchema": {
        "description": "The dry run's rows. Counters are absent on purpose: nothing ran.",
        "properties": {
          "rows": {
            "items": {
              "$ref": "#/components/schemas/ExportPreviewRowSchema"
            },
            "title": "Rows",
            "type": "array"
          }
        },
        "required": [
          "rows"
        ],
        "title": "ExportPreviewResponseSchema",
        "type": "object"
      },
      "ExportPreviewRowSchema": {
        "description": "What a real run WOULD do for one row.",
        "properties": {
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A per-row resolution failure, if any.",
            "title": "Error"
          },
          "identity": {
            "additionalProperties": true,
            "description": "The rendered match values.",
            "title": "Identity",
            "type": "object"
          },
          "matched_record_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The destination record the row matched, when one exists.",
            "title": "Matched Record Id"
          },
          "properties": {
            "additionalProperties": true,
            "description": "The rendered outgoing payload.",
            "title": "Properties",
            "type": "object"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "skipped_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a row would be skipped.",
            "title": "Skipped Reason"
          },
          "would": {
            "description": "'create', 'update' or 'skip', resolved by read-only matching.",
            "title": "Would",
            "type": "string"
          }
        },
        "required": [
          "record_id",
          "would",
          "identity",
          "properties",
          "matched_record_id",
          "skipped_reason",
          "error"
        ],
        "title": "ExportPreviewRowSchema",
        "type": "object"
      },
      "ExportRetryPolicy": {
        "description": "One export column's reliability contract with its destination.\n\nDefaults are chosen so the common case needs no configuration: retry the\nerrors worth retrying (rate limits, server errors, network failures) a\nfew times, honour the destination's own Retry-After when it names one,\nand otherwise write as fast as the destination accepts.",
        "properties": {
          "max_retries": {
            "default": 3,
            "description": "Retry attempts per row beyond the first, when retrying at all.",
            "maximum": 10.0,
            "minimum": 0.0,
            "title": "Max Retries",
            "type": "integer"
          },
          "requests_per_minute": {
            "anyOf": [
              {
                "maximum": 6000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Custom ceiling on write calls per minute. None means the destination's own pace. Its live rate-limit answers are honoured either way.",
            "title": "Requests Per Minute"
          },
          "retry_on_failure": {
            "default": true,
            "description": "Retry a row whose failure is retryable: rate limits, server errors, network failures. Bad requests never retry: the same payload would fail the same way.",
            "title": "Retry On Failure",
            "type": "boolean"
          },
          "timeout_seconds": {
            "anyOf": [
              {
                "maximum": 600.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Response timeout per destination request. None uses the platform default.",
            "title": "Timeout Seconds"
          }
        },
        "title": "ExportRetryPolicy",
        "type": "object"
      },
      "ExportRunRequestedContextSchema": {
        "description": "Context for an export run requested at a given scope.",
        "properties": {
          "column_display_name": {
            "default": "",
            "title": "Column Display Name",
            "type": "string"
          },
          "integration_type": {
            "default": "",
            "title": "Integration Type",
            "type": "string"
          },
          "record_type": {
            "default": "",
            "title": "Record Type",
            "type": "string"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Run Id"
          },
          "scope": {
            "default": "",
            "title": "Scope",
            "type": "string"
          },
          "type": {
            "const": "export_run_requested",
            "default": "export_run_requested",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "ExportRunRequestedContextSchema",
        "type": "object"
      },
      "ExportValueSource-Input": {
        "description": "The per-row value written into ONE destination field.\n\n``template`` reuses the enrichment prompt format verbatim: ordered text\nand column-reference segments, references stored by column identity so a\nrename can never silently repoint a mapping and a delete is detectable.\n\nPASSTHROUGH RULE: when the template is exactly one whole-cell column\nreference (one segment, no path), the RAW stored cell value is sent, not\nits rendered text, so a LIST cell reaches a multi-select property as a list\nand a NUMBER cell as a number. Any other shape (text around a reference,\ntwo references, a path) renders to a string, because concatenation only\nhas a string answer.",
        "properties": {
          "template": {
            "$ref": "#/components/schemas/EnrichmentPromptTemplate"
          }
        },
        "title": "ExportValueSource",
        "type": "object"
      },
      "ExportValueSource-Output": {
        "description": "The per-row value written into ONE destination field.\n\n``template`` reuses the enrichment prompt format verbatim: ordered text\nand column-reference segments, references stored by column identity so a\nrename can never silently repoint a mapping and a delete is detectable.\n\nPASSTHROUGH RULE: when the template is exactly one whole-cell column\nreference (one segment, no path), the RAW stored cell value is sent, not\nits rendered text, so a LIST cell reaches a multi-select property as a list\nand a NUMBER cell as a number. Any other shape (text around a reference,\ntwo references, a path) renders to a string, because concatenation only\nhas a string answer.",
        "properties": {
          "template": {
            "$ref": "#/components/schemas/EnrichmentPromptTemplate"
          }
        },
        "title": "ExportValueSource",
        "type": "object"
      },
      "ExportWriteAction": {
        "description": "What one export cell does at the destination.\n\nIts own vocabulary, not a copy of the integration stratum's\n``WriteBehavior``: the members and their values differ, and\n``table_export_integration`` translates between the two at the seam\n(``_WRITE_BEHAVIOR_TO_EXPORT_ACTION``). Mirroring has no member here\nbecause it deletes and recreates the whole destination object, which is a\nwhole-object concern rather than a per-row one.",
        "enum": [
          "create",
          "update",
          "upsert"
        ],
        "title": "ExportWriteAction",
        "type": "string"
      },
      "ExportWriteEstimateSchema": {
        "description": "One export column the run would fire, and how much it would write.",
        "properties": {
          "action": {
            "description": "create, update or upsert: what happens to records that already exist at the destination.",
            "title": "Action",
            "type": "string"
          },
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "display_name": {
            "description": "The export column's name, for the confirmation copy.",
            "title": "Display Name",
            "type": "string"
          },
          "integration_type": {
            "description": "Destination provider slug, e.g. 'hubspot'.",
            "title": "Integration Type",
            "type": "string"
          },
          "record_type": {
            "description": "Destination object written, e.g. 'contacts'.",
            "title": "Record Type",
            "type": "string"
          },
          "rows": {
            "description": "Rows this column would attempt to write.",
            "title": "Rows",
            "type": "integer"
          }
        },
        "required": [
          "column_id",
          "display_name",
          "integration_type",
          "record_type",
          "action",
          "rows"
        ],
        "title": "ExportWriteEstimateSchema",
        "type": "object"
      },
      "FeedbackRating": {
        "description": "The human verdict on one message: a thumb, not a scale.",
        "enum": [
          "good",
          "bad"
        ],
        "title": "FeedbackRating",
        "type": "string"
      },
      "FeedbackSource": {
        "description": "Where a piece of feedback came from, which says how much it means.",
        "enum": [
          "approval_card",
          "inbox_draft",
          "agent_tab",
          "approved_unchanged",
          "positive_reply",
          "sent_message"
        ],
        "title": "FeedbackSource",
        "type": "string"
      },
      "FeedbackSubjectKind": {
        "description": "What a thumbs down was given on.",
        "enum": [
          "table_cells",
          "agent_preview",
          "task",
          "writing_preview",
          "reply_draft",
          "sent_message",
          "hand_edit"
        ],
        "title": "FeedbackSubjectKind",
        "type": "string"
      },
      "FieldChangeSchema": {
        "description": "A single field change in an update.",
        "properties": {
          "field": {
            "title": "Field",
            "type": "string"
          },
          "new_value": {
            "title": "New Value"
          },
          "old_value": {
            "title": "Old Value"
          }
        },
        "required": [
          "field",
          "old_value",
          "new_value"
        ],
        "title": "FieldChangeSchema",
        "type": "object"
      },
      "FileColumnDistributionSchema": {
        "description": "How one column of a file's values are spread across its rows: a chart, computed on read.\n\nCounts cover every data row of the file's selected sheet (or a CSV), before any import\nrow cap. Whitespace-only cells are empty; nonempty values are counted as the file spells\nthem, uncoerced. The raw values themselves are a page of their own, at\n``\u2026/columns/{source_index}/values/``.",
        "properties": {
          "distinct_count": {
            "description": "Distinct nonempty values.",
            "title": "Distinct Count",
            "type": "integer"
          },
          "empty_count": {
            "description": "Rows whose cell is empty or whitespace-only.",
            "title": "Empty Count",
            "type": "integer"
          },
          "name": {
            "description": "The column's name, from the header row.",
            "title": "Name",
            "type": "string"
          },
          "other_count": {
            "description": "Nonempty rows holding a value outside `values`.",
            "title": "Other Count",
            "type": "integer"
          },
          "total_count": {
            "description": "Every data row of the sheet, empty cells included.",
            "title": "Total Count",
            "type": "integer"
          },
          "values": {
            "description": "The 20 most common values, most common first, ties in file order.",
            "items": {
              "$ref": "#/components/schemas/FileValueFrequencySchema"
            },
            "title": "Values",
            "type": "array"
          }
        },
        "required": [
          "name",
          "total_count",
          "empty_count",
          "distinct_count",
          "values",
          "other_count"
        ],
        "title": "FileColumnDistributionSchema",
        "type": "object"
      },
      "FileValueFrequencySchema": {
        "description": "One nonempty value of a file's column and its share of all rows.",
        "properties": {
          "count": {
            "description": "Rows holding the value.",
            "title": "Count",
            "type": "integer"
          },
          "percentage": {
            "description": "The share of all rows holding it, empty rows included.",
            "title": "Percentage",
            "type": "number"
          },
          "value": {
            "description": "The value as the file spells it, uncoerced.",
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value",
          "count",
          "percentage"
        ],
        "title": "FileValueFrequencySchema",
        "type": "object"
      },
      "FlagFilterSchema": {
        "description": "A yes/no attribute. Omit the whole object, or its value, for \"don't care\".\n\nAn object around a single boolean, rather than a bare optional boolean,\nbecause the client keeps a draft of every filter as the user moves between\nmodules, and a toggle that has been set to \"no\" has to survive that trip\ndistinguishably from one that was never touched.",
        "properties": {
          "value": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value"
          }
        },
        "title": "FlagFilterSchema",
        "type": "object"
      },
      "FollowContactOutcome": {
        "additionalProperties": false,
        "description": "What following a member produced: the common fields and the nine profile facts.\n\n``already_following`` re-read after the click is the verification.",
        "properties": {
          "already_connected": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Connected"
          },
          "already_following": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Following"
          },
          "can_send_message": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Can Send Message"
          },
          "found_already": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInFoundAlready"
              },
              {
                "type": "null"
              }
            ]
          },
          "invitation_pending": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invitation Pending"
          },
          "kind": {
            "const": "follow_contact",
            "default": "follow_contact",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "member_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 8,
            "title": "Member Urns",
            "type": "array"
          },
          "open_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open Profile"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "profile_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Resolved"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "vanity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity"
          }
        },
        "title": "FollowContactOutcome",
        "type": "object"
      },
      "FollowContactParams": {
        "additionalProperties": false,
        "description": "Follow a member without connecting to them. ``profile_url`` is where the browser goes.",
        "properties": {
          "kind": {
            "const": "follow_contact",
            "default": "follow_contact",
            "title": "Kind",
            "type": "string"
          },
          "profile_url": {
            "maxLength": 512,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "profile_url"
        ],
        "title": "FollowContactParams",
        "type": "object"
      },
      "ForbiddenResponse": {
        "properties": {
          "detail": {
            "description": "The detail of why the request is forbidden.",
            "title": "Detail",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "title": "ForbiddenResponse",
        "type": "object"
      },
      "FormulaColumnDefinition-Input": {
        "description": "Definition of a formula column: a pure-function chain over other columns.",
        "properties": {
          "chain": {
            "discriminator": {
              "mapping": {
                "arithmetic": "#/components/schemas/TableArithmetic-Input",
                "change_case": "#/components/schemas/TableChangeCase-Input",
                "clamp": "#/components/schemas/TableClamp-Input",
                "coalesce": "#/components/schemas/TableCoalesce-Input",
                "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                "concatenate": "#/components/schemas/TableConcatenate-Input",
                "conditions": "#/components/schemas/TableConditions-Input",
                "copy": "#/components/schemas/TableCopy-Input",
                "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                "date_diff": "#/components/schemas/TableDateDiff-Input",
                "date_extract": "#/components/schemas/TableDateExtract-Input",
                "date_format": "#/components/schemas/TableDateFormat-Input",
                "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                "format": "#/components/schemas/TableFormat-Input",
                "get_path": "#/components/schemas/TableGetPath-Input",
                "hash": "#/components/schemas/TableHash-Input",
                "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                "keywords": "#/components/schemas/TableKeywords-Input",
                "list_count": "#/components/schemas/TableListCount-Input",
                "list_filter": "#/components/schemas/TableListFilter-Input",
                "list_first": "#/components/schemas/TableListFirst-Input",
                "list_intersect": "#/components/schemas/TableListIntersect-Input",
                "list_join": "#/components/schemas/TableListJoin-Input",
                "list_last": "#/components/schemas/TableListLast-Input",
                "list_nth": "#/components/schemas/TableListNth-Input",
                "list_pluck": "#/components/schemas/TableListPluck-Input",
                "list_sort": "#/components/schemas/TableListSort-Input",
                "list_split": "#/components/schemas/TableListSplit-Input",
                "list_unique": "#/components/schemas/TableListUnique-Input",
                "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                "replace": "#/components/schemas/TableReplace-Input",
                "round": "#/components/schemas/TableRound-Input",
                "round_robin": "#/components/schemas/TableRoundRobin-Input",
                "score_words": "#/components/schemas/TableScoreWords-Input",
                "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                "to_bool": "#/components/schemas/TableToBool-Input",
                "to_date": "#/components/schemas/TableToDate-Input",
                "to_float": "#/components/schemas/TableToFloat-Input",
                "to_int": "#/components/schemas/TableToInt-Input",
                "to_string": "#/components/schemas/TableToString-Input",
                "trim": "#/components/schemas/TableTrim-Input",
                "uri_encode": "#/components/schemas/TableUriEncode-Input",
                "url_domain": "#/components/schemas/TableUrlDomain-Input",
                "url_valid": "#/components/schemas/TableUrlValid-Input",
                "utm_parse": "#/components/schemas/TableUtmParse-Input",
                "value_mapping": "#/components/schemas/TableValueMapping-Input",
                "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
              },
              "propertyName": "function"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/TableCopy-Input"
              },
              {
                "$ref": "#/components/schemas/TableChangeCase-Input"
              },
              {
                "$ref": "#/components/schemas/TableTrim-Input"
              },
              {
                "$ref": "#/components/schemas/TableReplace-Input"
              },
              {
                "$ref": "#/components/schemas/TableRegexExtract-Input"
              },
              {
                "$ref": "#/components/schemas/TableRegexReplace-Input"
              },
              {
                "$ref": "#/components/schemas/TableConcatenate-Input"
              },
              {
                "$ref": "#/components/schemas/TableArithmetic-Input"
              },
              {
                "$ref": "#/components/schemas/TableRound-Input"
              },
              {
                "$ref": "#/components/schemas/TableClamp-Input"
              },
              {
                "$ref": "#/components/schemas/TableDateFormat-Input"
              },
              {
                "$ref": "#/components/schemas/TableDateExtract-Input"
              },
              {
                "$ref": "#/components/schemas/TableDateArithmetic-Input"
              },
              {
                "$ref": "#/components/schemas/TableListFirst-Input"
              },
              {
                "$ref": "#/components/schemas/TableListLast-Input"
              },
              {
                "$ref": "#/components/schemas/TableListNth-Input"
              },
              {
                "$ref": "#/components/schemas/TableListJoin-Input"
              },
              {
                "$ref": "#/components/schemas/TableListCount-Input"
              },
              {
                "$ref": "#/components/schemas/TableListPluck-Input"
              },
              {
                "$ref": "#/components/schemas/TableListUnique-Input"
              },
              {
                "$ref": "#/components/schemas/TableListSplit-Input"
              },
              {
                "$ref": "#/components/schemas/TableCoalesce-Input"
              },
              {
                "$ref": "#/components/schemas/TableIfThenElse-Input"
              },
              {
                "$ref": "#/components/schemas/TableConditions-Input"
              },
              {
                "$ref": "#/components/schemas/TableValueMapping-Input"
              },
              {
                "$ref": "#/components/schemas/TableToString-Input"
              },
              {
                "$ref": "#/components/schemas/TableToInt-Input"
              },
              {
                "$ref": "#/components/schemas/TableToFloat-Input"
              },
              {
                "$ref": "#/components/schemas/TableToBool-Input"
              },
              {
                "$ref": "#/components/schemas/TableToDate-Input"
              },
              {
                "$ref": "#/components/schemas/TablePhoneE164-Input"
              },
              {
                "$ref": "#/components/schemas/TableUtmParse-Input"
              },
              {
                "$ref": "#/components/schemas/TableUrlDomain-Input"
              },
              {
                "$ref": "#/components/schemas/TableCompanyDomain-Input"
              },
              {
                "$ref": "#/components/schemas/TableGetPath-Input"
              },
              {
                "$ref": "#/components/schemas/TableFormat-Input"
              },
              {
                "$ref": "#/components/schemas/TableDateDiff-Input"
              },
              {
                "$ref": "#/components/schemas/TableKeywords-Input"
              },
              {
                "$ref": "#/components/schemas/TableListFilter-Input"
              },
              {
                "$ref": "#/components/schemas/TableListSort-Input"
              },
              {
                "$ref": "#/components/schemas/TableListIntersect-Input"
              },
              {
                "$ref": "#/components/schemas/TableTextSimilarity-Input"
              },
              {
                "$ref": "#/components/schemas/TableDetectLanguage-Input"
              },
              {
                "$ref": "#/components/schemas/TableScoreWords-Input"
              },
              {
                "$ref": "#/components/schemas/TableHash-Input"
              },
              {
                "$ref": "#/components/schemas/TableUriEncode-Input"
              },
              {
                "$ref": "#/components/schemas/TableUrlValid-Input"
              },
              {
                "$ref": "#/components/schemas/TableEmailPermutations-Input"
              },
              {
                "$ref": "#/components/schemas/TableRoundRobin-Input"
              },
              {
                "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
              }
            ],
            "title": "Chain"
          },
          "kind": {
            "const": "formula",
            "default": "formula",
            "title": "Kind",
            "type": "string"
          }
        },
        "required": [
          "chain"
        ],
        "title": "FormulaColumnDefinition",
        "type": "object"
      },
      "FormulaColumnDefinition-Output": {
        "description": "Definition of a formula column: a pure-function chain over other columns.",
        "properties": {
          "chain": {
            "discriminator": {
              "mapping": {
                "arithmetic": "#/components/schemas/TableArithmetic-Output",
                "change_case": "#/components/schemas/TableChangeCase-Output",
                "clamp": "#/components/schemas/TableClamp-Output",
                "coalesce": "#/components/schemas/TableCoalesce-Output",
                "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                "concatenate": "#/components/schemas/TableConcatenate-Output",
                "conditions": "#/components/schemas/TableConditions-Output",
                "copy": "#/components/schemas/TableCopy-Output",
                "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                "date_diff": "#/components/schemas/TableDateDiff-Output",
                "date_extract": "#/components/schemas/TableDateExtract-Output",
                "date_format": "#/components/schemas/TableDateFormat-Output",
                "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                "format": "#/components/schemas/TableFormat-Output",
                "get_path": "#/components/schemas/TableGetPath-Output",
                "hash": "#/components/schemas/TableHash-Output",
                "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                "keywords": "#/components/schemas/TableKeywords-Output",
                "list_count": "#/components/schemas/TableListCount-Output",
                "list_filter": "#/components/schemas/TableListFilter-Output",
                "list_first": "#/components/schemas/TableListFirst-Output",
                "list_intersect": "#/components/schemas/TableListIntersect-Output",
                "list_join": "#/components/schemas/TableListJoin-Output",
                "list_last": "#/components/schemas/TableListLast-Output",
                "list_nth": "#/components/schemas/TableListNth-Output",
                "list_pluck": "#/components/schemas/TableListPluck-Output",
                "list_sort": "#/components/schemas/TableListSort-Output",
                "list_split": "#/components/schemas/TableListSplit-Output",
                "list_unique": "#/components/schemas/TableListUnique-Output",
                "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                "replace": "#/components/schemas/TableReplace-Output",
                "round": "#/components/schemas/TableRound-Output",
                "round_robin": "#/components/schemas/TableRoundRobin-Output",
                "score_words": "#/components/schemas/TableScoreWords-Output",
                "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                "to_bool": "#/components/schemas/TableToBool-Output",
                "to_date": "#/components/schemas/TableToDate-Output",
                "to_float": "#/components/schemas/TableToFloat-Output",
                "to_int": "#/components/schemas/TableToInt-Output",
                "to_string": "#/components/schemas/TableToString-Output",
                "trim": "#/components/schemas/TableTrim-Output",
                "uri_encode": "#/components/schemas/TableUriEncode-Output",
                "url_domain": "#/components/schemas/TableUrlDomain-Output",
                "url_valid": "#/components/schemas/TableUrlValid-Output",
                "utm_parse": "#/components/schemas/TableUtmParse-Output",
                "value_mapping": "#/components/schemas/TableValueMapping-Output",
                "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
              },
              "propertyName": "function"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/TableCopy-Output"
              },
              {
                "$ref": "#/components/schemas/TableChangeCase-Output"
              },
              {
                "$ref": "#/components/schemas/TableTrim-Output"
              },
              {
                "$ref": "#/components/schemas/TableReplace-Output"
              },
              {
                "$ref": "#/components/schemas/TableRegexExtract-Output"
              },
              {
                "$ref": "#/components/schemas/TableRegexReplace-Output"
              },
              {
                "$ref": "#/components/schemas/TableConcatenate-Output"
              },
              {
                "$ref": "#/components/schemas/TableArithmetic-Output"
              },
              {
                "$ref": "#/components/schemas/TableRound-Output"
              },
              {
                "$ref": "#/components/schemas/TableClamp-Output"
              },
              {
                "$ref": "#/components/schemas/TableDateFormat-Output"
              },
              {
                "$ref": "#/components/schemas/TableDateExtract-Output"
              },
              {
                "$ref": "#/components/schemas/TableDateArithmetic-Output"
              },
              {
                "$ref": "#/components/schemas/TableListFirst-Output"
              },
              {
                "$ref": "#/components/schemas/TableListLast-Output"
              },
              {
                "$ref": "#/components/schemas/TableListNth-Output"
              },
              {
                "$ref": "#/components/schemas/TableListJoin-Output"
              },
              {
                "$ref": "#/components/schemas/TableListCount-Output"
              },
              {
                "$ref": "#/components/schemas/TableListPluck-Output"
              },
              {
                "$ref": "#/components/schemas/TableListUnique-Output"
              },
              {
                "$ref": "#/components/schemas/TableListSplit-Output"
              },
              {
                "$ref": "#/components/schemas/TableCoalesce-Output"
              },
              {
                "$ref": "#/components/schemas/TableIfThenElse-Output"
              },
              {
                "$ref": "#/components/schemas/TableConditions-Output"
              },
              {
                "$ref": "#/components/schemas/TableValueMapping-Output"
              },
              {
                "$ref": "#/components/schemas/TableToString-Output"
              },
              {
                "$ref": "#/components/schemas/TableToInt-Output"
              },
              {
                "$ref": "#/components/schemas/TableToFloat-Output"
              },
              {
                "$ref": "#/components/schemas/TableToBool-Output"
              },
              {
                "$ref": "#/components/schemas/TableToDate-Output"
              },
              {
                "$ref": "#/components/schemas/TablePhoneE164-Output"
              },
              {
                "$ref": "#/components/schemas/TableUtmParse-Output"
              },
              {
                "$ref": "#/components/schemas/TableUrlDomain-Output"
              },
              {
                "$ref": "#/components/schemas/TableCompanyDomain-Output"
              },
              {
                "$ref": "#/components/schemas/TableGetPath-Output"
              },
              {
                "$ref": "#/components/schemas/TableFormat-Output"
              },
              {
                "$ref": "#/components/schemas/TableDateDiff-Output"
              },
              {
                "$ref": "#/components/schemas/TableKeywords-Output"
              },
              {
                "$ref": "#/components/schemas/TableListFilter-Output"
              },
              {
                "$ref": "#/components/schemas/TableListSort-Output"
              },
              {
                "$ref": "#/components/schemas/TableListIntersect-Output"
              },
              {
                "$ref": "#/components/schemas/TableTextSimilarity-Output"
              },
              {
                "$ref": "#/components/schemas/TableDetectLanguage-Output"
              },
              {
                "$ref": "#/components/schemas/TableScoreWords-Output"
              },
              {
                "$ref": "#/components/schemas/TableHash-Output"
              },
              {
                "$ref": "#/components/schemas/TableUriEncode-Output"
              },
              {
                "$ref": "#/components/schemas/TableUrlValid-Output"
              },
              {
                "$ref": "#/components/schemas/TableEmailPermutations-Output"
              },
              {
                "$ref": "#/components/schemas/TableRoundRobin-Output"
              },
              {
                "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
              }
            ],
            "title": "Chain"
          },
          "kind": {
            "const": "formula",
            "default": "formula",
            "title": "Kind",
            "type": "string"
          }
        },
        "required": [
          "chain"
        ],
        "title": "FormulaColumnDefinition",
        "type": "object"
      },
      "FunctionCatalogEntrySchema": {
        "description": "UI-facing metadata for one table function.",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/TableFunctionCategory"
          },
          "function": {
            "title": "Function",
            "type": "string"
          },
          "label": {
            "title": "Label",
            "type": "string"
          }
        },
        "required": [
          "function",
          "label",
          "category"
        ],
        "title": "FunctionCatalogEntrySchema",
        "type": "object"
      },
      "GateClause": {
        "description": "One comparison inside a :class:`TableConditions` step.\n\n``source`` is an ``Operand`` rather than a bare ``UUID`` deliberately, and\nthe dependency walk is the reason: ``chain_refs._walk_for_column_refs`` collects\n:class:`ColumnRef` instances reflectively wherever they are nested, but a\nbare UUID on a nested model is invisible to it. Spelled as an operand, a\nclause's column lands in ``run_condition_column_ids`` (and therefore in\nthe compute page's read projection) for free. Spelled as a UUID it would\nevaluate against a missing value on every row.\n\n``compare_value`` also admits a list of strings, which is what the two list\noperators take: the terms a filter panel collects as chips arrive exactly as\nthe row filter receives them, and a string holding ``\"a, b, c\"`` is read the\nsame way, so a hand-typed gate is not held to a stricter shape.",
        "properties": {
          "compare_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Compare Value"
          },
          "operator": {
            "enum": [
              "eq",
              "neq",
              "gt",
              "lt",
              "gte",
              "lte",
              "contains",
              "not_contains",
              "contains_any_of",
              "not_contains_any_of",
              "starts_with",
              "is_empty",
              "is_not_empty",
              "is_true",
              "is_false"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source"
          }
        },
        "required": [
          "operator"
        ],
        "title": "GateClause",
        "type": "object"
      },
      "GateGroup-Input": {
        "description": "A parenthesised run of clauses, joined among themselves.\n\nHolds clauses and never other groups: one level of nesting is expressible\nand a second is not, by construction rather than by validation. That is the\nrow filter's own rule (``TableRowFilterGroup``), adopted here for the same\nreason and one more: a filter can only be saved as a gate losslessly if the\ngate can say exactly what the filter says (``A and (B or C)``) and no\nmore, so nothing a gate expresses is ever unreadable as a filter.",
        "properties": {
          "clauses": {
            "items": {
              "$ref": "#/components/schemas/GateClause"
            },
            "maxItems": 8,
            "minItems": 1,
            "title": "Clauses",
            "type": "array"
          },
          "joiner": {
            "default": "and",
            "enum": [
              "and",
              "or"
            ],
            "title": "Joiner",
            "type": "string"
          },
          "type": {
            "const": "group",
            "default": "group",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "clauses"
        ],
        "title": "GateGroup",
        "type": "object"
      },
      "GateGroup-Output": {
        "description": "A parenthesised run of clauses, joined among themselves.\n\nHolds clauses and never other groups: one level of nesting is expressible\nand a second is not, by construction rather than by validation. That is the\nrow filter's own rule (``TableRowFilterGroup``), adopted here for the same\nreason and one more: a filter can only be saved as a gate losslessly if the\ngate can say exactly what the filter says (``A and (B or C)``) and no\nmore, so nothing a gate expresses is ever unreadable as a filter.",
        "properties": {
          "clauses": {
            "items": {
              "$ref": "#/components/schemas/GateClause"
            },
            "maxItems": 8,
            "minItems": 1,
            "title": "Clauses",
            "type": "array"
          },
          "joiner": {
            "default": "and",
            "enum": [
              "and",
              "or"
            ],
            "title": "Joiner",
            "type": "string"
          },
          "type": {
            "const": "group",
            "default": "group",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "clauses"
        ],
        "title": "GateGroup",
        "type": "object"
      },
      "GenerateDraftSchema": {
        "properties": {
          "steer_text": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Steer Text"
          }
        },
        "title": "GenerateDraftSchema",
        "type": "object"
      },
      "GenerateEnrichmentColumnRequestSchema": {
        "description": "One sentence to turn into a draft AI-column configuration.",
        "properties": {
          "instruction": {
            "description": "A plain-language description of the column to build.",
            "maxLength": 2000,
            "minLength": 1,
            "title": "Instruction",
            "type": "string"
          },
          "table_id": {
            "description": "The table whose columns the prompt may reference.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "instruction"
        ],
        "title": "GenerateEnrichmentColumnRequestSchema",
        "type": "object"
      },
      "GeoFilterSchema": {
        "description": "A place to search around: an address, or a point, plus a radius.\n\nSend whichever you have. An address is resolved to a point server-side,\nagainst Google Maps data, which any surface displaying the results must\ncredit to \"Google Maps\". An address that resolves to nothing is refused\nrather than dropped, so a search is never quietly run over the whole\nworld.",
        "properties": {
          "address": {
            "anyOf": [
              {
                "maxLength": 250,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A street address, neighbourhood, postcode or city.",
            "title": "Address"
          },
          "latitude": {
            "anyOf": [
              {
                "maximum": 90.0,
                "minimum": -90.0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Latitude"
          },
          "longitude": {
            "anyOf": [
              {
                "maximum": 180.0,
                "minimum": -180.0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Longitude"
          },
          "radius_km": {
            "anyOf": [
              {
                "maximum": 500.0,
                "minimum": 1.0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "How far around the point to search, in whole KILOMETRES, at least 1. The data source takes an integer radius (its minimum is 1) and a fraction is rounded to the nearest kilometre.",
            "title": "Radius Km"
          }
        },
        "title": "GeoFilterSchema",
        "type": "object"
      },
      "GeocodedAddressResponseSchema": {
        "description": "Where an address is, so a builder can show the circle before it searches.\n\nCarries the address back with the point. The caller is a box the user is\nstill typing in, and an answer that arrives after the text has moved on is\nonly safe to draw if it says which text it answers.",
        "properties": {
          "address": {
            "description": "The address that was resolved, trimmed. Echoed back so a late answer can be told from a current one.",
            "title": "Address",
            "type": "string"
          },
          "latitude": {
            "description": "Degrees north, between -90 and 90.",
            "title": "Latitude",
            "type": "number"
          },
          "longitude": {
            "description": "Degrees east, between -180 and 180.",
            "title": "Longitude",
            "type": "number"
          }
        },
        "required": [
          "address",
          "latitude",
          "longitude"
        ],
        "title": "GeocodedAddressResponseSchema",
        "type": "object"
      },
      "GoogleConnectCallbackSchema": {
        "properties": {
          "code": {
            "maxLength": 2048,
            "minLength": 1,
            "title": "Code",
            "type": "string"
          },
          "state": {
            "maxLength": 512,
            "minLength": 1,
            "title": "State",
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "title": "GoogleConnectCallbackSchema",
        "type": "object"
      },
      "GoogleConnectStartResponseSchema": {
        "properties": {
          "authorize_url": {
            "title": "Authorize Url",
            "type": "string"
          }
        },
        "required": [
          "authorize_url"
        ],
        "title": "GoogleConnectStartResponseSchema",
        "type": "object"
      },
      "GoogleConnectStartSchema": {
        "properties": {
          "login_hint": {
            "anyOf": [
              {
                "maxLength": 320,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Pre-select this account on Google's chooser, so a reconnect should land on the mailbox that broke, not whichever account the browser is signed into.",
            "title": "Login Hint"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Attach the new mailbox to this profile on connect.",
            "title": "Sender Profile Id"
          }
        },
        "title": "GoogleConnectStartSchema",
        "type": "object"
      },
      "GoogleDriveConnectCallbackSchema": {
        "description": "What Google sent to the callback page.",
        "properties": {
          "code": {
            "maxLength": 2048,
            "minLength": 1,
            "title": "Code",
            "type": "string"
          },
          "state": {
            "maxLength": 512,
            "minLength": 1,
            "title": "State",
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "title": "GoogleDriveConnectCallbackSchema",
        "type": "object"
      },
      "GoogleDriveConnectStartResponseSchema": {
        "description": "Where to send the browser to grant access.",
        "properties": {
          "authorize_url": {
            "title": "Authorize Url",
            "type": "string"
          }
        },
        "required": [
          "authorize_url"
        ],
        "title": "GoogleDriveConnectStartResponseSchema",
        "type": "object"
      },
      "GoogleDriveConnectionReadSchema": {
        "description": "Whether the signed-in user has connected Drive in this workspace.\n\nAlways a 200, never a 404: the settings page is asking \"Connect, or pick?\"\nand both answers are ordinary.",
        "properties": {
          "configured": {
            "description": "Whether this deployment has a Google Drive client at all. False means the Connect button should not be offered.",
            "title": "Configured",
            "type": "boolean"
          },
          "connected": {
            "title": "Connected",
            "type": "boolean"
          },
          "connected_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Connected At"
          },
          "google_account_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which Google account is connected, for the caption.",
            "title": "Google Account Email"
          }
        },
        "required": [
          "configured",
          "connected",
          "google_account_email",
          "connected_at"
        ],
        "title": "GoogleDriveConnectionReadSchema",
        "type": "object"
      },
      "GrowthFilterSchema": {
        "description": "Headcount growth over a chosen window, as a min/max percentage band.",
        "properties": {
          "max_percent": {
            "anyOf": [
              {
                "maximum": 10000.0,
                "minimum": -100.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Percent"
          },
          "min_percent": {
            "anyOf": [
              {
                "maximum": 10000.0,
                "minimum": -100.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Percent"
          },
          "timespan": {
            "$ref": "#/components/schemas/GrowthTimespan",
            "default": "12months"
          }
        },
        "title": "GrowthFilterSchema",
        "type": "object"
      },
      "GrowthTimespan": {
        "description": "The window a headcount-growth percentage is measured over.\n\nThe company index measures the last month, quarter and year (added\n2026-09-16 for the first two); six and twenty-four months were the lead\ndatabase's windows and are refused by name on a company search.",
        "enum": [
          "1month",
          "3months",
          "6months",
          "12months",
          "24months"
        ],
        "title": "GrowthTimespan",
        "type": "string"
      },
      "HandEditCreateSchema": {
        "description": "Propose a learning from a person's own edit of one message the agent wrote.",
        "properties": {
          "request_id": {
            "description": "The client's key for this proposal: sent again (a double click, a retry), it answers what the first one did and calls no model.",
            "format": "uuid",
            "title": "Request Id",
            "type": "string"
          },
          "subject": {
            "$ref": "#/components/schemas/HandEditSubjectSchema",
            "description": "Where the edited words stand."
          }
        },
        "required": [
          "subject",
          "request_id"
        ],
        "title": "HandEditCreateSchema",
        "type": "object"
      },
      "HandEditRequestCreateSchema": {
        "description": "A learning proposed from a person's own edit, in the background.",
        "properties": {
          "kind": {
            "const": "hand_edit",
            "description": "A proposal from an edit, as `POST /agent-learnings/hand-edits/` takes it.",
            "title": "Kind",
            "type": "string"
          },
          "request_id": {
            "description": "The client's key for this proposal: sent again (a double click, a retry), it answers what the first one did and calls no model.",
            "format": "uuid",
            "title": "Request Id",
            "type": "string"
          },
          "subject": {
            "$ref": "#/components/schemas/HandEditSubjectSchema",
            "description": "Where the edited words stand."
          }
        },
        "required": [
          "subject",
          "request_id",
          "kind"
        ],
        "title": "HandEditRequestCreateSchema",
        "type": "object"
      },
      "HandEditSubjectSchema": {
        "description": "A person's own edit of one message the agent wrote, by where the words stand.",
        "properties": {
          "kind": {
            "const": "hand_edit",
            "title": "Kind",
            "type": "string"
          },
          "target": {
            "discriminator": {
              "mapping": {
                "message": "#/components/schemas/MessageTargetSchema",
                "override": "#/components/schemas/OverrideTargetSchema",
                "reply_draft": "#/components/schemas/ReplyDraftTargetSchema",
                "task": "#/components/schemas/TaskTargetSchema"
              },
              "propertyName": "target_kind"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/TaskTargetSchema"
              },
              {
                "$ref": "#/components/schemas/MessageTargetSchema"
              },
              {
                "$ref": "#/components/schemas/OverrideTargetSchema"
              },
              {
                "$ref": "#/components/schemas/ReplyDraftTargetSchema"
              }
            ],
            "title": "Target"
          }
        },
        "required": [
          "kind",
          "target"
        ],
        "title": "HandEditSubjectSchema",
        "type": "object"
      },
      "HealthCheckFailureSchema": {
        "description": "A single failed integration in a bulk health check run.",
        "properties": {
          "error_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Human-readable error message from the latest check.",
            "title": "Error Message"
          },
          "integration_id": {
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "integration_id",
          "name"
        ],
        "title": "HealthCheckFailureSchema",
        "type": "object"
      },
      "HealthCheckReadSchema": {
        "description": "Response model for a single health check result.",
        "properties": {
          "checked_at": {
            "description": "When the health check was performed.",
            "format": "date-time",
            "title": "Checked At",
            "type": "string"
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Machine-readable error code.",
            "title": "Error Code"
          },
          "error_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Human-readable error message.",
            "title": "Error Message"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/IntegrationHealthStatus",
            "description": "Health check status: healthy, warning, or error."
          }
        },
        "required": [
          "id",
          "status",
          "checked_at"
        ],
        "title": "HealthCheckReadSchema",
        "type": "object"
      },
      "HeldBySequenceReadSchema": {
        "description": "A sequence of this workspace named on a contact: its id and name.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "HeldBySequenceReadSchema",
        "type": "object"
      },
      "HiringCompaniesQuerySchema": {
        "description": "Filters for a search for companies with open roles matching a job title.\n\nThe rows are companies, one per employer, each carrying every open\nposting the search read for it. The count is of open postings, since the\ncompanies are folded from them once they are read.",
        "properties": {
          "cities": {
            "description": "Cities the roles are based in. Up to 20.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Cities",
            "type": "array"
          },
          "company_domains": {
            "description": "Only roles at these employers, by website domain. Up to 100.",
            "items": {
              "type": "string"
            },
            "maxItems": 100,
            "title": "Company Domains",
            "type": "array"
          },
          "company_funded_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only employers whose last round closed on or after this day, as YYYY-MM-DD.",
            "title": "Company Funded After"
          },
          "company_funding_amount": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The size of the employer's last round, in US dollars."
          },
          "company_funding_round_types": {
            "description": "The type of the employer's last funding round, for example Seed or Series A.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Company Funding Round Types",
            "type": "array"
          },
          "company_technologies": {
            "description": "Only employers whose website runs one of these technologies, for example HubSpot. Up to 20.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Company Technologies",
            "type": "array"
          },
          "countries": {
            "description": "Countries the roles are based in, by full name the way a posting spells it: United States, not US. Up to 20.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Countries",
            "type": "array"
          },
          "departments": {
            "description": "The role's department, from the same list the people search uses, for example Sales or Engineering and Technical. Any other value is refused.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Departments",
            "type": "array"
          },
          "employee_count": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The employer's headcount."
          },
          "industries": {
            "description": "Only employers in these industries, each matched as a phrase in the employer's industry name. Up to 25.",
            "items": {
              "type": "string"
            },
            "maxItems": 25,
            "title": "Industries",
            "type": "array"
          },
          "job_functions": {
            "description": "The role's job functions, for example Sales, Information Technology or Software Development, each matched as a phrase. Up to 20.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Job Functions",
            "type": "array"
          },
          "job_title": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/JobTitleFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Phrases an open posting's title must carry, any of them, up to 10 each way. A phrase is matched whole and in order: Identity Management matches Senior Identity Management Engineer and not Manager of Identity. At least one title or keyword phrase is required; nothing else can anchor a hiring search."
          },
          "keywords": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/JobTitleFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Phrases in the posting's description, matched the same way. The other way to anchor the search: companies whose openings mention Okta, whatever the role is called."
          },
          "posted_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only postings published on or after this day, as YYYY-MM-DD.",
            "title": "Posted After"
          },
          "posted_before": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only postings published on or before this day, as YYYY-MM-DD.",
            "title": "Posted Before"
          },
          "seniorities": {
            "description": "The role's seniority, from: Internship, Entry level, Associate, Mid-Senior level, Director, Executive or Not Applicable. Any other value is refused.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Seniorities",
            "type": "array"
          },
          "states": {
            "description": "States or provinces the roles are based in, written out in full. Up to 20.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "States",
            "type": "array"
          }
        },
        "title": "HiringCompaniesQuerySchema",
        "type": "object"
      },
      "HoldReason": {
        "description": "Why the send path pushed a live contact's ``due_at`` out instead of sending.\n\nStored beside the date it explains so the Contacts tab can say \"Approved,\nwindow opens in 3 hours\" rather than a bare date. Only ever meaningful on\nan ACTIVE row whose date is still ahead; any other write clears it.",
        "enum": [
          "window",
          "approved_window",
          "daily_cap",
          "no_mailbox",
          "pacing",
          "agent_unavailable",
          "no_message",
          "agent_writing",
          "agent_queued",
          "approval_queued",
          "mailbox_waiting",
          "no_linkedin_account",
          "confirming_send",
          "email_check",
          "out_of_office",
          "browser_queued",
          "browser_running",
          "browser_unavailable"
        ],
        "title": "HoldReason",
        "type": "string"
      },
      "HttpApiJwtSettings-Input": {
        "description": "Settings for the JWT-authenticated HTTP API action.\n\nSame request as :class:`HttpApiSettings` with the one thing that cannot be\nhand-written in a header: a JWT minted per run from the caller's own\nsecret, so the token in flight is short-lived instead of a permanent\ncredential pasted into a header field.",
        "properties": {
          "body": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentPromptTemplate"
              },
              {
                "type": "string"
              }
            ],
            "description": "Request body for POST/PUT/PATCH: text and column references, or a string in which {{Column name}} stands for that column's value in the row. Each value is escaped for the body's format, read off the Content-Type header (JSON, form or XML), or JSON when there is none and the body is JSON: inside a JSON string it is escaped text; outside one it is a single JSON value of the cell's own type."
          },
          "headers": {
            "additionalProperties": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/EnrichmentPromptTemplate"
                },
                {
                  "type": "string"
                }
              ]
            },
            "description": "Sent with every row's request, e.g. an Authorization header. Each value is a template like the body: text and column references, or a string in which {{Column name}} stands for that column's value in the row.",
            "maxProperties": 20,
            "title": "Headers",
            "type": "object"
          },
          "json_path": {
            "default": "",
            "maxLength": 200,
            "title": "Json Path",
            "type": "string"
          },
          "jwt_claims": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Claims to sign, e.g. {'iss': 'oneprofile'}.",
            "maxProperties": 20,
            "title": "Jwt Claims",
            "type": "object"
          },
          "jwt_header": {
            "default": "Authorization",
            "description": "Which header carries the token.",
            "maxLength": 100,
            "title": "Jwt Header",
            "type": "string"
          },
          "jwt_prefix": {
            "default": "Bearer ",
            "description": "Prefix in front of the token, e.g. 'Bearer '.",
            "maxLength": 20,
            "title": "Jwt Prefix",
            "type": "string"
          },
          "jwt_secret": {
            "default": "",
            "description": "The shared secret the token is signed with (HS256).",
            "maxLength": 1000,
            "title": "Jwt Secret",
            "type": "string"
          },
          "jwt_ttl_seconds": {
            "default": 300,
            "description": "How long each minted token stays valid.",
            "maximum": 3600.0,
            "minimum": 30.0,
            "title": "Jwt Ttl Seconds",
            "type": "integer"
          },
          "kind": {
            "const": "http_api_jwt",
            "default": "http_api_jwt",
            "title": "Kind",
            "type": "string"
          },
          "method": {
            "default": "GET",
            "enum": [
              "GET",
              "POST",
              "PUT",
              "PATCH",
              "DELETE"
            ],
            "title": "Method",
            "type": "string"
          }
        },
        "title": "HttpApiJwtSettings",
        "type": "object"
      },
      "HttpApiJwtSettings-Output": {
        "description": "Settings for the JWT-authenticated HTTP API action.\n\nSame request as :class:`HttpApiSettings` with the one thing that cannot be\nhand-written in a header: a JWT minted per run from the caller's own\nsecret, so the token in flight is short-lived instead of a permanent\ncredential pasted into a header field.",
        "properties": {
          "body": {
            "$ref": "#/components/schemas/EnrichmentPromptTemplate",
            "description": "Request body for POST/PUT/PATCH: text and column references, or a string in which {{Column name}} stands for that column's value in the row. Each value is escaped for the body's format, read off the Content-Type header (JSON, form or XML), or JSON when there is none and the body is JSON: inside a JSON string it is escaped text; outside one it is a single JSON value of the cell's own type."
          },
          "headers": {
            "additionalProperties": {
              "$ref": "#/components/schemas/EnrichmentPromptTemplate"
            },
            "description": "Sent with every row's request, e.g. an Authorization header. Each value is a template like the body: text and column references, or a string in which {{Column name}} stands for that column's value in the row.",
            "maxProperties": 20,
            "title": "Headers",
            "type": "object"
          },
          "json_path": {
            "default": "",
            "maxLength": 200,
            "title": "Json Path",
            "type": "string"
          },
          "jwt_claims": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Claims to sign, e.g. {'iss': 'oneprofile'}.",
            "maxProperties": 20,
            "title": "Jwt Claims",
            "type": "object"
          },
          "jwt_header": {
            "default": "Authorization",
            "description": "Which header carries the token.",
            "maxLength": 100,
            "title": "Jwt Header",
            "type": "string"
          },
          "jwt_prefix": {
            "default": "Bearer ",
            "description": "Prefix in front of the token, e.g. 'Bearer '.",
            "maxLength": 20,
            "title": "Jwt Prefix",
            "type": "string"
          },
          "jwt_secret": {
            "default": "",
            "description": "The shared secret the token is signed with (HS256).",
            "maxLength": 1000,
            "title": "Jwt Secret",
            "type": "string"
          },
          "jwt_ttl_seconds": {
            "default": 300,
            "description": "How long each minted token stays valid.",
            "maximum": 3600.0,
            "minimum": 30.0,
            "title": "Jwt Ttl Seconds",
            "type": "integer"
          },
          "kind": {
            "const": "http_api_jwt",
            "default": "http_api_jwt",
            "title": "Kind",
            "type": "string"
          },
          "method": {
            "default": "GET",
            "enum": [
              "GET",
              "POST",
              "PUT",
              "PATCH",
              "DELETE"
            ],
            "title": "Method",
            "type": "string"
          }
        },
        "title": "HttpApiJwtSettings",
        "type": "object"
      },
      "HttpApiSettings-Input": {
        "description": "Settings for the HTTP API action: one request per row, described here.\n\nThe URL is the column's prompt, so it can carry ``{{column}}`` tokens the\nsame way every other prompt does and gets the same picker. Everything a\nURL cannot express lives here, and the body and header values carry\ncolumn references of the same kind (see ``HttpRequestTemplate``).\n\n``json_path`` is what turns a response into a CELL: an API answers with a\ndocument, and the column usually wants one value out of it. Dotted, with\ninteger segments indexing arrays: ``data.0.email``. Left empty the whole\ndecoded body lands in the cell.",
        "properties": {
          "body": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentPromptTemplate"
              },
              {
                "type": "string"
              }
            ],
            "description": "Request body for POST/PUT/PATCH: text and column references, or a string in which {{Column name}} stands for that column's value in the row. Each value is escaped for the body's format, read off the Content-Type header (JSON, form or XML), or JSON when there is none and the body is JSON: inside a JSON string it is escaped text; outside one it is a single JSON value of the cell's own type."
          },
          "headers": {
            "additionalProperties": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/EnrichmentPromptTemplate"
                },
                {
                  "type": "string"
                }
              ]
            },
            "description": "Sent with every row's request, e.g. an Authorization header. Each value is a template like the body: text and column references, or a string in which {{Column name}} stands for that column's value in the row.",
            "maxProperties": 20,
            "title": "Headers",
            "type": "object"
          },
          "json_path": {
            "default": "",
            "description": "Dotted path to the value to keep, e.g. data.0.email.",
            "maxLength": 200,
            "title": "Json Path",
            "type": "string"
          },
          "kind": {
            "const": "http_api",
            "default": "http_api",
            "title": "Kind",
            "type": "string"
          },
          "method": {
            "default": "GET",
            "enum": [
              "GET",
              "POST",
              "PUT",
              "PATCH",
              "DELETE"
            ],
            "title": "Method",
            "type": "string"
          }
        },
        "title": "HttpApiSettings",
        "type": "object"
      },
      "HttpApiSettings-Output": {
        "description": "Settings for the HTTP API action: one request per row, described here.\n\nThe URL is the column's prompt, so it can carry ``{{column}}`` tokens the\nsame way every other prompt does and gets the same picker. Everything a\nURL cannot express lives here, and the body and header values carry\ncolumn references of the same kind (see ``HttpRequestTemplate``).\n\n``json_path`` is what turns a response into a CELL: an API answers with a\ndocument, and the column usually wants one value out of it. Dotted, with\ninteger segments indexing arrays: ``data.0.email``. Left empty the whole\ndecoded body lands in the cell.",
        "properties": {
          "body": {
            "$ref": "#/components/schemas/EnrichmentPromptTemplate",
            "description": "Request body for POST/PUT/PATCH: text and column references, or a string in which {{Column name}} stands for that column's value in the row. Each value is escaped for the body's format, read off the Content-Type header (JSON, form or XML), or JSON when there is none and the body is JSON: inside a JSON string it is escaped text; outside one it is a single JSON value of the cell's own type."
          },
          "headers": {
            "additionalProperties": {
              "$ref": "#/components/schemas/EnrichmentPromptTemplate"
            },
            "description": "Sent with every row's request, e.g. an Authorization header. Each value is a template like the body: text and column references, or a string in which {{Column name}} stands for that column's value in the row.",
            "maxProperties": 20,
            "title": "Headers",
            "type": "object"
          },
          "json_path": {
            "default": "",
            "description": "Dotted path to the value to keep, e.g. data.0.email.",
            "maxLength": 200,
            "title": "Json Path",
            "type": "string"
          },
          "kind": {
            "const": "http_api",
            "default": "http_api",
            "title": "Kind",
            "type": "string"
          },
          "method": {
            "default": "GET",
            "enum": [
              "GET",
              "POST",
              "PUT",
              "PATCH",
              "DELETE"
            ],
            "title": "Method",
            "type": "string"
          }
        },
        "title": "HttpApiSettings",
        "type": "object"
      },
      "IdentityFieldOptionSchema": {
        "description": "One key of the sampled records' ids, as a way to match rows across refreshes.",
        "properties": {
          "editable": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True when people can edit this field in the tool, so an edited record comes back as a new row; false when the tool sets it and it never changes; null when the tool does not say.",
            "title": "Editable"
          },
          "field": {
            "description": "The key, as the tool names it. Send it as identity_field.",
            "title": "Field",
            "type": "string"
          },
          "filled": {
            "description": "How many sampled records carry a value for it.",
            "title": "Filled",
            "type": "integer"
          },
          "label": {
            "description": "The key's name for a person to read, e.g. 'Record ID'.",
            "title": "Label",
            "type": "string"
          },
          "problem": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IdentityFieldProblem"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why rows cannot be matched on it: `missing` when some records have no value, `shared` when two records hold the same one. Null when they can."
          },
          "sampled": {
            "description": "How many records were sampled.",
            "title": "Sampled",
            "type": "integer"
          },
          "unique": {
            "description": "Whether no two different sampled records share a value.",
            "title": "Unique",
            "type": "boolean"
          }
        },
        "required": [
          "field",
          "label",
          "sampled",
          "filled",
          "unique",
          "editable",
          "problem"
        ],
        "title": "IdentityFieldOptionSchema",
        "type": "object"
      },
      "IdentityFieldProblem": {
        "description": "Why a key cannot match rows.\n\n``MISSING`` and ``SHARED`` are facts about values: some records (or rows)\nhave none, or two different ones hold the same. ``INEXACT`` is about how a\nvalue is stored: only text and whole numbers come back out of a row's\nstored record exactly as the provider sends them, and re-keying stored rows\non anything else would match nothing on the next refresh.",
        "enum": [
          "missing",
          "shared",
          "inexact"
        ],
        "title": "IdentityFieldProblem",
        "type": "string"
      },
      "IdentityVerificationReadSchema": {
        "description": "A freshly created hosted identity-verification flow.",
        "properties": {
          "url": {
            "description": "Where to send the person to complete verification.",
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "title": "IdentityVerificationReadSchema",
        "type": "object"
      },
      "ImportColumnMappingSchema": {
        "description": "How one CSV field should become one table column.",
        "properties": {
          "column_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "description": "The type to create the column with."
          },
          "name": {
            "description": "The column's display name.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "source_index": {
            "description": "The field's zero-based position in the file.",
            "minimum": 0.0,
            "title": "Source Index",
            "type": "integer"
          }
        },
        "required": [
          "source_index",
          "name",
          "column_type"
        ],
        "title": "ImportColumnMappingSchema",
        "type": "object"
      },
      "ImportColumnValueSchema": {
        "description": "One raw value of an uploaded file's column, as a page of the column's values holds it.",
        "properties": {
          "number": {
            "description": "The data row the value is in, counted from 1 under the header, in file order.",
            "title": "Number",
            "type": "integer"
          },
          "value": {
            "description": "The value as the file spells it, uncoerced.",
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "number",
          "value"
        ],
        "title": "ImportColumnValueSchema",
        "type": "object"
      },
      "ImportPreviewColumnSchema": {
        "description": "One column as inferred from the uploaded file.",
        "properties": {
          "distribution": {
            "$ref": "#/components/schemas/ValueDistribution",
            "description": "Exact raw value frequencies across the entire selected sheet or CSV, before row caps. Whitespace-only cells are empty; nonempty values are not coerced."
          },
          "inferred_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "description": "The type every sampled value fits."
          },
          "name": {
            "description": "Suggested column name, taken from the header row.",
            "title": "Name",
            "type": "string"
          },
          "sample_values": {
            "description": "A few raw values, to judge the guess by.",
            "items": {
              "type": "string"
            },
            "title": "Sample Values",
            "type": "array"
          },
          "source_index": {
            "description": "The field's zero-based position in the file.",
            "title": "Source Index",
            "type": "integer"
          }
        },
        "required": [
          "source_index",
          "name",
          "inferred_type",
          "sample_values",
          "distribution"
        ],
        "title": "ImportPreviewColumnSchema",
        "type": "object"
      },
      "ImportRowErrorSchema": {
        "description": "One row the import could not write, and why.",
        "properties": {
          "reason": {
            "description": "Which column rejected the value, and why.",
            "title": "Reason",
            "type": "string"
          },
          "row_number": {
            "description": "One-based data-row number in the file.",
            "title": "Row Number",
            "type": "integer"
          }
        },
        "required": [
          "row_number",
          "reason"
        ],
        "title": "ImportRowErrorSchema",
        "type": "object"
      },
      "ImportRowRangeSchema": {
        "description": "A run of the file's rows to import, both ends included.\n\nRows 21 to 30 are `{\"first\": 21, \"last\": 30}`, and one row is a range whose\nends are the same. The field that carries the ranges says how its rows are\nnumbered.",
        "properties": {
          "first": {
            "description": "The first row of the range, counted from 1.",
            "minimum": 1.0,
            "title": "First",
            "type": "integer"
          },
          "last": {
            "description": "The last row of the range; `first` for one row.",
            "minimum": 1.0,
            "title": "Last",
            "type": "integer"
          }
        },
        "required": [
          "first",
          "last"
        ],
        "title": "ImportRowRangeSchema",
        "type": "object"
      },
      "InMailOutcome": {
        "additionalProperties": false,
        "description": "What sending an InMail produced: the common fields, the profile facts and the thread.\n\n``conversation_urn`` links the thread exactly as it does for a direct\nmessage: read off the composer for a new thread, and the one the step was\ngiven for a reply, where the profile facts stay ``None`` because the\nmessaging page shows no profile.",
        "properties": {
          "already_connected": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Connected"
          },
          "already_following": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Following"
          },
          "can_send_message": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Can Send Message"
          },
          "conversation_urn": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Conversation Urn"
          },
          "found_already": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInFoundAlready"
              },
              {
                "type": "null"
              }
            ]
          },
          "invitation_pending": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invitation Pending"
          },
          "kind": {
            "const": "inmail",
            "default": "inmail",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "member_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 8,
            "title": "Member Urns",
            "type": "array"
          },
          "open_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open Profile"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "profile_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Resolved"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "vanity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity"
          }
        },
        "title": "InMailOutcome",
        "type": "object"
      },
      "InMailParams": {
        "additionalProperties": false,
        "description": "Send an InMail: a message with a subject line, priced against the sender's own credits.\n\nAddressed exactly like a direct message: a sequence step names the\ncontact's profile, an inbox reply names the thread, and the validator\nrequires one of the two. ``member_urn`` travels with a thread reply because\nthe messaging page shows no profile to read it off, and comes back\nunchanged on the outcome.\n\nThe subject has its own, much lower ceiling. Each text carries its length\nbefore clipping under the same rule as every other clipped field.",
        "properties": {
          "body": {
            "maxLength": 1900,
            "title": "Body",
            "type": "string"
          },
          "body_original_length": {
            "default": 0,
            "minimum": 0.0,
            "title": "Body Original Length",
            "type": "integer"
          },
          "conversation_urn": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Conversation Urn"
          },
          "kind": {
            "const": "inmail",
            "default": "inmail",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "profile_url": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Url"
          },
          "subject": {
            "default": "",
            "maxLength": 200,
            "title": "Subject",
            "type": "string"
          },
          "subject_original_length": {
            "default": 0,
            "minimum": 0.0,
            "title": "Subject Original Length",
            "type": "integer"
          }
        },
        "required": [
          "body"
        ],
        "title": "InMailParams",
        "type": "object"
      },
      "InboxChannel": {
        "description": "Which surface a conversation happens on.\n\nThreads are contact-scoped, not channel-scoped, so this says how a thread is\nREACHED rather than partitioning the inbox: a reply arrives, is classified\nand stops the cadence identically either way, and only the send path differs.",
        "enum": [
          "email",
          "linkedin"
        ],
        "title": "InboxChannel",
        "type": "string"
      },
      "InboxInvalidatedEventSchema": {
        "description": "The single inbox change-feed event: something changed, refetch what you show.\n\n``thread_id`` narrows the hint to one thread; None means the thread list\nitself changed. The frontend debounces and invalidates either way, so one\ncoalesced event kind is all the wire ever carries.",
        "properties": {
          "thread_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Thread Id"
          }
        },
        "title": "InboxInvalidatedEventSchema",
        "type": "object"
      },
      "InboxkitConnectPreviewResponseSchema": {
        "properties": {
          "workspaces": {
            "items": {
              "$ref": "#/components/schemas/InboxkitWorkspaceReadSchema"
            },
            "title": "Workspaces",
            "type": "array"
          }
        },
        "required": [
          "workspaces"
        ],
        "title": "InboxkitConnectPreviewResponseSchema",
        "type": "object"
      },
      "InboxkitConnectPreviewSchema": {
        "properties": {
          "api_key": {
            "maxLength": 512,
            "minLength": 8,
            "title": "Api Key",
            "type": "string"
          }
        },
        "required": [
          "api_key"
        ],
        "title": "InboxkitConnectPreviewSchema",
        "type": "object"
      },
      "InboxkitConnectSchema": {
        "properties": {
          "api_key": {
            "maxLength": 512,
            "minLength": 8,
            "title": "Api Key",
            "type": "string"
          },
          "workspace_id": {
            "maxLength": 64,
            "minLength": 1,
            "title": "Workspace Id",
            "type": "string"
          }
        },
        "required": [
          "api_key",
          "workspace_id"
        ],
        "title": "InboxkitConnectSchema",
        "type": "object"
      },
      "InboxkitConnectionReadSchema": {
        "properties": {
          "auto_disconnect_enabled": {
            "title": "Auto Disconnect Enabled",
            "type": "boolean"
          },
          "auto_import_enabled": {
            "title": "Auto Import Enabled",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "workspace_id": {
            "title": "Workspace Id",
            "type": "string"
          },
          "workspace_name": {
            "title": "Workspace Name",
            "type": "string"
          }
        },
        "required": [
          "workspace_id",
          "workspace_name",
          "auto_import_enabled",
          "auto_disconnect_enabled",
          "created_at",
          "updated_at"
        ],
        "title": "InboxkitConnectionReadSchema",
        "type": "object"
      },
      "InboxkitConnectionStatusSchema": {
        "description": "Always-200 connection state.\n\n\"Not connected\" is an ordinary state the dialog branches on, not an error.\nAnswering it with a 404 would be indistinguishable from a transient failure\non the client, and a transient failure must never present the connect form\nover a working connection.",
        "properties": {
          "active_import_run": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InboxkitImportRunReadSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "connected": {
            "title": "Connected",
            "type": "boolean"
          },
          "connection": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InboxkitConnectionReadSchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "connected",
          "connection"
        ],
        "title": "InboxkitConnectionStatusSchema",
        "type": "object"
      },
      "InboxkitConnectionUpdateSchema": {
        "properties": {
          "auto_disconnect_enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "title": "Auto Disconnect Enabled"
          },
          "auto_import_enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "title": "Auto Import Enabled"
          }
        },
        "title": "InboxkitConnectionUpdateSchema",
        "type": "object"
      },
      "InboxkitDisconnectedSchema": {
        "description": "What disconnecting InboxKit did to the mailboxes it imported.\n\nAnswered the same on a dry run and on the real call.",
        "properties": {
          "count": {
            "default": 1,
            "description": "The number of resources that were deleted.",
            "title": "Count",
            "type": "integer"
          },
          "detail": {
            "description": "The detail of why the resource was deleted.",
            "title": "Detail",
            "type": "string"
          },
          "mailboxes_deleted": {
            "description": "Imported mailboxes this call deletes.",
            "title": "Mailboxes Deleted",
            "type": "integer"
          },
          "mailboxes_disconnected": {
            "description": "Connected imported mailboxes this call disconnects.",
            "title": "Mailboxes Disconnected",
            "type": "integer"
          },
          "mailboxes_missing": {
            "description": "Imported mailboxes already removed by hand before this call.",
            "title": "Mailboxes Missing",
            "type": "integer"
          }
        },
        "required": [
          "detail",
          "mailboxes_disconnected",
          "mailboxes_deleted",
          "mailboxes_missing"
        ],
        "title": "InboxkitDisconnectedSchema",
        "type": "object"
      },
      "InboxkitDomainReadSchema": {
        "properties": {
          "authorized_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Authorized At"
          },
          "delegation_status": {
            "$ref": "#/components/schemas/DomainDelegationStatus"
          },
          "domain_name": {
            "title": "Domain Name",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "status_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status Reason"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "domain_name",
          "delegation_status",
          "status_reason",
          "authorized_at",
          "updated_at"
        ],
        "title": "InboxkitDomainReadSchema",
        "type": "object"
      },
      "InboxkitImportResponseSchema": {
        "properties": {
          "domains_authorizing": {
            "items": {
              "type": "string"
            },
            "title": "Domains Authorizing",
            "type": "array"
          },
          "imported_now": {
            "title": "Imported Now",
            "type": "integer"
          },
          "run_id": {
            "format": "uuid",
            "title": "Run Id",
            "type": "string"
          }
        },
        "required": [
          "imported_now",
          "domains_authorizing",
          "run_id"
        ],
        "title": "InboxkitImportResponseSchema",
        "type": "object"
      },
      "InboxkitImportRunDetailReadSchema": {
        "properties": {
          "failed_count": {
            "title": "Failed Count",
            "type": "integer"
          },
          "finished_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Finished At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "imported_count": {
            "title": "Imported Count",
            "type": "integer"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/InboxkitImportRunItemReadSchema"
            },
            "title": "Items",
            "type": "array"
          },
          "requested_count": {
            "title": "Requested Count",
            "type": "integer"
          },
          "skipped_count": {
            "title": "Skipped Count",
            "type": "integer"
          },
          "started_at": {
            "format": "date-time",
            "title": "Started At",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/InboxkitImportRunStatus"
          },
          "trigger": {
            "$ref": "#/components/schemas/InboxkitImportRunTrigger"
          }
        },
        "required": [
          "id",
          "trigger",
          "status",
          "requested_count",
          "imported_count",
          "skipped_count",
          "failed_count",
          "started_at",
          "finished_at",
          "items"
        ],
        "title": "InboxkitImportRunDetailReadSchema",
        "type": "object"
      },
      "InboxkitImportRunItemReadSchema": {
        "properties": {
          "domain_name": {
            "title": "Domain Name",
            "type": "string"
          },
          "email_address": {
            "title": "Email Address",
            "type": "string"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason"
          },
          "status": {
            "$ref": "#/components/schemas/InboxkitImportRunItemStatus"
          }
        },
        "required": [
          "email_address",
          "domain_name",
          "status",
          "reason"
        ],
        "title": "InboxkitImportRunItemReadSchema",
        "type": "object"
      },
      "InboxkitImportRunItemStatus": {
        "description": "One requested mailbox's outcome within an import run.\n\nPENDING items sit on an already-authorized domain awaiting the synchronous\nimport; AUTHORIZING items wait on their domain's delegation handshake. The\nterminal states: IMPORTED connected, SKIPPED_UNLISTED vanished from\nInboxKit's inventory between request and import, FAILED carries a reason.",
        "enum": [
          "pending",
          "authorizing",
          "imported",
          "skipped_unlisted",
          "failed"
        ],
        "title": "InboxkitImportRunItemStatus",
        "type": "string"
      },
      "InboxkitImportRunReadSchema": {
        "properties": {
          "failed_count": {
            "title": "Failed Count",
            "type": "integer"
          },
          "finished_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Finished At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "imported_count": {
            "title": "Imported Count",
            "type": "integer"
          },
          "requested_count": {
            "title": "Requested Count",
            "type": "integer"
          },
          "skipped_count": {
            "title": "Skipped Count",
            "type": "integer"
          },
          "started_at": {
            "format": "date-time",
            "title": "Started At",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/InboxkitImportRunStatus"
          },
          "trigger": {
            "$ref": "#/components/schemas/InboxkitImportRunTrigger"
          }
        },
        "required": [
          "id",
          "trigger",
          "status",
          "requested_count",
          "imported_count",
          "skipped_count",
          "failed_count",
          "started_at",
          "finished_at"
        ],
        "title": "InboxkitImportRunReadSchema",
        "type": "object"
      },
      "InboxkitImportRunStatus": {
        "description": "Where one import request stands.\n\nRUNNING until every item reaches a terminal state; then SUCCEEDED when\neverything imported, FAILED when nothing did, PARTIAL for the mix. Status\nand counts are always derived from items. Three independent paths (the\nsynchronous import, the authorize workflow's import, and its failure\nbranches) finalize items, so denormalized counters would drift.",
        "enum": [
          "running",
          "succeeded",
          "partial",
          "failed"
        ],
        "title": "InboxkitImportRunStatus",
        "type": "string"
      },
      "InboxkitImportRunTrigger": {
        "description": "Who asked for the import: a person in the picker, or the hourly sweep.",
        "enum": [
          "manual",
          "auto"
        ],
        "title": "InboxkitImportRunTrigger",
        "type": "string"
      },
      "InboxkitImportSchema": {
        "properties": {
          "daily_send_limit": {
            "anyOf": [
              {
                "maximum": 2000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Daily Send Limit"
          },
          "email_addresses": {
            "items": {
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 1,
            "title": "Email Addresses",
            "type": "array"
          }
        },
        "required": [
          "email_addresses"
        ],
        "title": "InboxkitImportSchema",
        "type": "object"
      },
      "InboxkitInventoryDomainReadSchema": {
        "properties": {
          "delegation_status": {
            "$ref": "#/components/schemas/DomainDelegationStatus"
          },
          "domain_name": {
            "title": "Domain Name",
            "type": "string"
          },
          "mailboxes": {
            "items": {
              "$ref": "#/components/schemas/InboxkitInventoryMailboxReadSchema"
            },
            "title": "Mailboxes",
            "type": "array"
          },
          "status_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status Reason"
          }
        },
        "required": [
          "domain_name",
          "delegation_status",
          "status_reason",
          "mailboxes"
        ],
        "title": "InboxkitInventoryDomainReadSchema",
        "type": "object"
      },
      "InboxkitInventoryMailboxReadSchema": {
        "properties": {
          "email_address": {
            "title": "Email Address",
            "type": "string"
          },
          "imported": {
            "description": "True when this mailbox is connected in this workspace. One imported before and disconnected since is false, so it can be imported again.",
            "title": "Imported",
            "type": "boolean"
          },
          "vendor_status": {
            "title": "Vendor Status",
            "type": "string"
          }
        },
        "required": [
          "email_address",
          "vendor_status",
          "imported"
        ],
        "title": "InboxkitInventoryMailboxReadSchema",
        "type": "object"
      },
      "InboxkitWorkspaceReadSchema": {
        "properties": {
          "name": {
            "title": "Name",
            "type": "string"
          },
          "workspace_id": {
            "title": "Workspace Id",
            "type": "string"
          }
        },
        "required": [
          "workspace_id",
          "name"
        ],
        "title": "InboxkitWorkspaceReadSchema",
        "type": "object"
      },
      "IntegrationAuditAction": {
        "description": "Action types for integration audit logs.",
        "enum": [
          "created",
          "updated",
          "deleted"
        ],
        "title": "IntegrationAuditAction",
        "type": "string"
      },
      "IntegrationAuditLogReadSchema": {
        "description": "Read schema for integration audit log.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/IntegrationAuditAction"
          },
          "actor": {
            "title": "Actor",
            "type": "string"
          },
          "actor_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Actor Display Name"
          },
          "actor_type": {
            "$ref": "#/components/schemas/ActorKind"
          },
          "context": {
            "discriminator": {
              "mapping": {
                "created": "#/components/schemas/IntegrationCreatedContextSchema",
                "deleted": "#/components/schemas/IntegrationDeletedContextSchema",
                "updated": "#/components/schemas/IntegrationUpdatedContextSchema"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/IntegrationCreatedContextSchema"
              },
              {
                "$ref": "#/components/schemas/IntegrationUpdatedContextSchema"
              },
              {
                "$ref": "#/components/schemas/IntegrationDeletedContextSchema"
              }
            ],
            "title": "Context"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "integration_id": {
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "integration_id",
          "action",
          "actor_type",
          "actor",
          "context",
          "created_at"
        ],
        "title": "IntegrationAuditLogReadSchema",
        "type": "object"
      },
      "IntegrationBulkVerifyResponseSchema": {
        "description": "Acknowledgement that background health checks were queued, and the run to follow them.",
        "properties": {
          "run_id": {
            "description": "The run that tracks these checks. Read its progress from the runs route.",
            "format": "uuid",
            "title": "Run Id",
            "type": "string"
          },
          "updated": {
            "description": "Number of health checks queued.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "run_id"
        ],
        "title": "IntegrationBulkVerifyResponseSchema",
        "type": "object"
      },
      "IntegrationCapability": {
        "description": "What a tool's SDK can do with records, for at least one record type.",
        "enum": [
          "list_records",
          "write_records",
          "get_record"
        ],
        "title": "IntegrationCapability",
        "type": "string"
      },
      "IntegrationCategoryCountSchema": {
        "description": "How many categories the directory has, and how many integrations they hold in all.",
        "properties": {
          "count": {
            "description": "The number of categories.",
            "title": "Count",
            "type": "integer"
          },
          "integration_count": {
            "description": "The number of integrations in the directory, across every category: the catalog's overall size. Counted the way each category's integration_count is, 'coming soon' entries included.",
            "title": "Integration Count",
            "type": "integer"
          }
        },
        "required": [
          "count",
          "integration_count"
        ],
        "title": "IntegrationCategoryCountSchema",
        "type": "object"
      },
      "IntegrationConnectMethod": {
        "description": "How a user connects an integration in the UI.\n\nExtensible: as app listings gain non-OAuth connect flows (e.g. install-bound URL secret,\nper-install signature), add members here rather than another boolean.\n\nAn integration *type* can advertise more than one of these (see\n``IntegrationTypeRead.connect_methods``); a specific *connection* records the single method it\nwas created with on ``IntegrationModel.connect_method``.",
        "enum": [
          "oauth_connect",
          "credentials_form"
        ],
        "title": "IntegrationConnectMethod",
        "type": "string"
      },
      "IntegrationCountSchema": {
        "description": "Response model for Count Integrations endpoint.",
        "properties": {
          "count": {
            "description": "The number of integrations for the organization.",
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "IntegrationCountSchema",
        "type": "object"
      },
      "IntegrationCreatedContextSchema": {
        "description": "Context for integration creation.",
        "properties": {
          "config": {
            "additionalProperties": true,
            "title": "Config",
            "type": "object"
          },
          "integration_type": {
            "title": "Integration Type",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "type": {
            "const": "created",
            "default": "created",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "name",
          "integration_type"
        ],
        "title": "IntegrationCreatedContextSchema",
        "type": "object"
      },
      "IntegrationDeletedContextSchema": {
        "description": "Context for integration deletion.",
        "properties": {
          "config": {
            "additionalProperties": true,
            "title": "Config",
            "type": "object"
          },
          "integration_type": {
            "title": "Integration Type",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "type": {
            "const": "deleted",
            "default": "deleted",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "name",
          "integration_type"
        ],
        "title": "IntegrationDeletedContextSchema",
        "type": "object"
      },
      "IntegrationDetailReadSchema": {
        "description": "One integration with its config and which of its credentials are set.\n\nThe General API's read, untyped by design: typing it per integration type would publish every\ntype's name in the General document, enrichment vendors among them. The Integration-Specific\nAPI's create and update answers carry the typed read.",
        "properties": {
          "config": {
            "additionalProperties": true,
            "description": "The integration's config, as its type defines it.",
            "title": "Config",
            "type": "object"
          },
          "connect_method": {
            "$ref": "#/components/schemas/IntegrationConnectMethod",
            "default": "credentials_form",
            "description": "How this connection authenticates: 'credentials_form' (API-key form) or 'oauth_connect' (one-click app-listing OAuth). Gates the switch/reconnect surfaces in the UI."
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_actor_type": {
            "$ref": "#/components/schemas/ActorKind",
            "description": "Type of actor that created this integration: 'user', 'api', or 'system'."
          },
          "created_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Display name of the creator. User's full name or 'API - {key name}'.",
            "title": "Created By Display Name"
          },
          "credentials_set": {
            "additionalProperties": {
              "type": "boolean"
            },
            "description": "Each credential the integration's type takes, and whether one is stored.",
            "title": "Credentials Set",
            "type": "object"
          },
          "health_checked_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the latest health check was performed.",
            "title": "Health Checked At"
          },
          "health_error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Machine-readable error code from the latest health check (e.g. 'unauthorized', 'insufficient_permissions', 'rate_limited'). Drives the 'Action required: reauthorize' state and Reconnect CTA when it is 'unauthorized' or 'insufficient_permissions'. Null if never checked or healthy.",
            "title": "Health Error Code"
          },
          "health_error_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Error message from the latest health check, if unhealthy.",
            "title": "Health Error Message"
          },
          "health_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IntegrationHealthStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Latest health check status: healthy, warning, or error. Null if never checked."
          },
          "icon_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The tool's logo from the integration directory; null when it has none.",
            "title": "Icon Url"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "integration_type": {
            "description": "The type of the integration.",
            "title": "Integration Type",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/IntegrationKindFilter",
            "description": "Indicates if the integration is a source, destination, or both."
          },
          "name": {
            "description": "The name of the integration as defined by the user.",
            "title": "Name",
            "type": "string"
          },
          "org_id": {
            "title": "Org Id",
            "type": "string"
          },
          "record_types": {
            "description": "Record types this integration supports, as display-ready chips matching the Data tab, each with what the tool can do with records of that type. Wildcard integrations also include a 'Custom' marker.",
            "items": {
              "$ref": "#/components/schemas/IntegrationRecordTypeCapabilitiesSchema"
            },
            "title": "Record Types",
            "type": "array"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "org_id",
          "integration_type",
          "name",
          "kind",
          "created_at",
          "updated_at",
          "created_by_actor_type",
          "config",
          "credentials_set"
        ],
        "title": "IntegrationDetailReadSchema",
        "type": "object"
      },
      "IntegrationHealthStatus": {
        "enum": [
          "healthy",
          "warning",
          "error"
        ],
        "title": "IntegrationHealthStatus",
        "type": "string"
      },
      "IntegrationKindFilter": {
        "description": "Query filter: source-only, destination-only, or both.",
        "enum": [
          "source",
          "destination",
          "both"
        ],
        "title": "IntegrationKindFilter",
        "type": "string"
      },
      "IntegrationLookupSettings": {
        "description": "Settings for the connected-integration record lookup: which record, where.\n\nThe identity VALUE is not here. It arrives per row through the action's\nbound input column, like ``resolve_hostname``'s hostname. What a column\nfixes is the address: which of the org's connections to ask\n(``integration_id``: an ID, not a name, because two connections to one\nsystem are two different destinations), which record type, and which of\nthe SDK's declared identity fields the value keys on.\n\nAll three are plain identifiers rather than integration-stratum types on\npurpose: this module sits in the table stratum, which may not import the\nintegration domain, so the executor (which lives above both) resolves and\nvalidates them at run time. ``identity_field`` defaults empty so a\nhalf-configured draft can be saved; the executor skips such a column\nrather than guessing a key.",
        "properties": {
          "identity_field": {
            "default": "",
            "description": "The identity field the bound value keys on, e.g. 'id' or 'email'.",
            "maxLength": 255,
            "title": "Identity Field",
            "type": "string"
          },
          "integration_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The org's connection to read from.",
            "title": "Integration Id"
          },
          "kind": {
            "const": "integration_lookup",
            "default": "integration_lookup",
            "title": "Kind",
            "type": "string"
          },
          "record_type": {
            "default": "",
            "description": "The record type to fetch, e.g. 'user' or 'organization'.",
            "maxLength": 255,
            "title": "Record Type",
            "type": "string"
          }
        },
        "title": "IntegrationLookupSettings",
        "type": "object"
      },
      "IntegrationReadSchema": {
        "description": "One integration as a list shows it, without its config or credentials.\n\nReading one integration adds both (``IntegrationDetailReadSchema``); each type's own read\nmodel (``integration_type_schemas``) types them by its SDK's models.",
        "properties": {
          "connect_method": {
            "$ref": "#/components/schemas/IntegrationConnectMethod",
            "default": "credentials_form",
            "description": "How this connection authenticates: 'credentials_form' (API-key form) or 'oauth_connect' (one-click app-listing OAuth). Gates the switch/reconnect surfaces in the UI."
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_actor_type": {
            "$ref": "#/components/schemas/ActorKind",
            "description": "Type of actor that created this integration: 'user', 'api', or 'system'."
          },
          "created_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Display name of the creator. User's full name or 'API - {key name}'.",
            "title": "Created By Display Name"
          },
          "health_checked_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the latest health check was performed.",
            "title": "Health Checked At"
          },
          "health_error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Machine-readable error code from the latest health check (e.g. 'unauthorized', 'insufficient_permissions', 'rate_limited'). Drives the 'Action required: reauthorize' state and Reconnect CTA when it is 'unauthorized' or 'insufficient_permissions'. Null if never checked or healthy.",
            "title": "Health Error Code"
          },
          "health_error_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Error message from the latest health check, if unhealthy.",
            "title": "Health Error Message"
          },
          "health_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IntegrationHealthStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Latest health check status: healthy, warning, or error. Null if never checked."
          },
          "icon_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The tool's logo from the integration directory; null when it has none.",
            "title": "Icon Url"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "integration_type": {
            "description": "The type of the integration.",
            "title": "Integration Type",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/IntegrationKindFilter",
            "description": "Indicates if the integration is a source, destination, or both."
          },
          "name": {
            "description": "The name of the integration as defined by the user.",
            "title": "Name",
            "type": "string"
          },
          "org_id": {
            "title": "Org Id",
            "type": "string"
          },
          "record_types": {
            "description": "Record types this integration supports, as display-ready chips matching the Data tab, each with what the tool can do with records of that type. Wildcard integrations also include a 'Custom' marker.",
            "items": {
              "$ref": "#/components/schemas/IntegrationRecordTypeCapabilitiesSchema"
            },
            "title": "Record Types",
            "type": "array"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "org_id",
          "integration_type",
          "name",
          "kind",
          "created_at",
          "updated_at",
          "created_by_actor_type"
        ],
        "title": "IntegrationReadSchema",
        "type": "object"
      },
      "IntegrationRecordTypeCapabilitiesSchema": {
        "description": "A record type of an integration, with what its tool can do with records of that type.",
        "properties": {
          "can_get_record": {
            "description": "True when one record of this type can be fetched by an identity value, so a lookup column can read it.",
            "title": "Can Get Record",
            "type": "boolean"
          },
          "can_list_records": {
            "description": "True when records of this type can be listed, so a table can import them.",
            "title": "Can List Records",
            "type": "boolean"
          },
          "display_name": {
            "description": "Human-readable name (e.g. 'Person', 'Contacts', 'Custom').",
            "title": "Display Name",
            "type": "string"
          },
          "identity_fields": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The fields a lookup may key on, in the tool's own order. Null unless the list was asked for them (with_identity_fields) and the live connection answered in budget; the record type is still lookupable, and the identity-fields route answers live.",
            "title": "Identity Fields"
          },
          "is_custom": {
            "description": "True for the wildcard 'Custom' marker (arbitrary/dynamic record types).",
            "title": "Is Custom",
            "type": "boolean"
          },
          "label": {
            "description": "The type's name as a picker or a suggested table name reads it: sentence case, no underscores ('Event type'), where `display_name` title-cases it for a chip.",
            "title": "Label",
            "type": "string"
          },
          "slug": {
            "description": "The record-type slug (e.g. 'person', 'contacts'), or '*' for Custom.",
            "title": "Slug",
            "type": "string"
          },
          "write_actions": {
            "description": "The ways a table can write records of this type: 'create', 'update' or 'upsert'. Empty when the tool cannot write this type.",
            "items": {
              "$ref": "#/components/schemas/ExportWriteAction"
            },
            "title": "Write Actions",
            "type": "array"
          }
        },
        "required": [
          "slug",
          "display_name",
          "is_custom",
          "label",
          "can_list_records",
          "can_get_record",
          "write_actions"
        ],
        "title": "IntegrationRecordTypeCapabilitiesSchema",
        "type": "object"
      },
      "IntegrationRecordTypeReadSchema": {
        "description": "A record type an integration handles, with a display-ready name.\n\nShared by the integrations list, the directory, and the record-type vocabulary endpoint so\nrecord-type chips render the same way everywhere.",
        "properties": {
          "display_name": {
            "description": "Human-readable name (e.g. 'Person', 'Contacts', 'Custom').",
            "title": "Display Name",
            "type": "string"
          },
          "is_custom": {
            "description": "True for the wildcard 'Custom' marker (arbitrary/dynamic record types).",
            "title": "Is Custom",
            "type": "boolean"
          },
          "slug": {
            "description": "The record-type slug (e.g. 'person', 'contacts'), or '*' for Custom.",
            "title": "Slug",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "display_name",
          "is_custom"
        ],
        "title": "IntegrationRecordTypeReadSchema",
        "type": "object"
      },
      "IntegrationRunReadSchema": {
        "description": "Progress and a status-grouped summary of one bulk health check run.",
        "properties": {
          "checked": {
            "description": "How many have a completed check since the run started.",
            "title": "Checked",
            "type": "integer"
          },
          "error": {
            "description": "Count checked with an error since the run started.",
            "title": "Error",
            "type": "integer"
          },
          "failures": {
            "description": "The error integrations (bounded), for quick links to the failures.",
            "items": {
              "$ref": "#/components/schemas/HealthCheckFailureSchema"
            },
            "title": "Failures",
            "type": "array"
          },
          "healthy": {
            "description": "Count checked healthy since the run started.",
            "title": "Healthy",
            "type": "integer"
          },
          "run_id": {
            "format": "uuid",
            "title": "Run Id",
            "type": "string"
          },
          "started_at": {
            "description": "Server clock when the run started. An integration counts as checked when its latest health check is newer than this.",
            "format": "date-time",
            "title": "Started At",
            "type": "string"
          },
          "total": {
            "description": "Total integrations in the run.",
            "title": "Total",
            "type": "integer"
          },
          "warning": {
            "description": "Count checked with a warning since the run started.",
            "title": "Warning",
            "type": "integer"
          }
        },
        "required": [
          "run_id",
          "started_at",
          "total",
          "checked",
          "healthy",
          "warning",
          "error",
          "failures"
        ],
        "title": "IntegrationRunReadSchema",
        "type": "object"
      },
      "IntegrationTypeGuideReadSchema": {
        "description": "Setup guide for an integration type.",
        "properties": {
          "content": {
            "description": "Full guide content as markdown.",
            "title": "Content",
            "type": "string"
          },
          "integration_type": {
            "description": "The integration type slug (e.g., 'stripe').",
            "title": "Integration Type",
            "type": "string"
          }
        },
        "required": [
          "integration_type",
          "content"
        ],
        "title": "IntegrationTypeGuideReadSchema",
        "type": "object"
      },
      "IntegrationTypeReadSchema": {
        "description": "Integration type metadata for the directory listing.",
        "properties": {
          "categories": {
            "description": "e.g. ['CRM', 'Marketing Automation']",
            "items": {
              "type": "string"
            },
            "title": "Categories",
            "type": "array"
          },
          "company_domain": {
            "description": "e.g. 'google.com', 'intercom.com'",
            "title": "Company Domain",
            "type": "string"
          },
          "config_schema": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "OpenAPI schema for connection settings. None if not implemented.",
            "title": "Config Schema"
          },
          "connect_methods": {
            "description": "The ways a user can connect this integration. Contains 'oauth_connect' when an app-listing OAuth manifest exists, and 'credentials_form' when the SDK exposes a non-empty (API-key) credentials form. A single-method type returns exactly one entry (the UI renders as before); a type supporting both returns both (the UI shows a chooser). Empty for unimplemented types.",
            "items": {
              "$ref": "#/components/schemas/IntegrationConnectMethod"
            },
            "title": "Connect Methods",
            "type": "array"
          },
          "created_at": {
            "description": "When added to directory",
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "credentials_schema": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "OpenAPI schema for auth credentials. None if not implemented.",
            "title": "Credentials Schema"
          },
          "description": {
            "description": "What the integration does, shown in detail view",
            "title": "Description",
            "type": "string"
          },
          "display_name": {
            "description": "UI label. e.g. 'Google Sheets'",
            "title": "Display Name",
            "type": "string"
          },
          "icon_url": {
            "description": "Full URL to icon. e.g. 'https://static.../intercom.svg'",
            "title": "Icon Url",
            "type": "string"
          },
          "id": {
            "description": "Unique ID. e.g. '123e4567-e89b-12d3-a456-426614174000'",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "implemented": {
            "description": "False = coming soon, can't connect yet",
            "title": "Implemented",
            "type": "boolean"
          },
          "integration_type": {
            "description": "Unique ID. e.g. 'googlesheets', 'intercom'",
            "title": "Integration Type",
            "type": "string"
          },
          "is_marketplace_listing": {
            "default": false,
            "description": "True when this integration has a marketplace app-listing (OAuth-connect or credentials-form). Orthogonal to connect_method: the directory renders a 'Connect <X>' button for a marketplace listing even when connect_method is 'credentials_form'. Derived from the app-listings catalog.",
            "title": "Is Marketplace Listing",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/IntegrationKindFilter",
            "default": "both",
            "description": "'source', 'destination', or 'both'"
          },
          "name": {
            "description": "Sort key. e.g. 'Google Sheets', 'Intercom'",
            "title": "Name",
            "type": "string"
          },
          "overview": {
            "description": "Brief overview of the integration's sync capabilities",
            "title": "Overview",
            "type": "string"
          },
          "record_types": {
            "description": "Record types this integration syncs, as display-ready chips. Empty for 'coming soon' integrations. Wildcard integrations include a 'Custom' marker.",
            "items": {
              "$ref": "#/components/schemas/IntegrationRecordTypeReadSchema"
            },
            "title": "Record Types",
            "type": "array"
          },
          "tagline": {
            "description": "Short tagline naming key data objects synced",
            "title": "Tagline",
            "type": "string"
          },
          "updated_at": {
            "description": "Last metadata update",
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "integration_type",
          "display_name",
          "company_domain",
          "categories",
          "description",
          "tagline",
          "overview",
          "icon_url",
          "implemented",
          "config_schema",
          "credentials_schema",
          "created_at",
          "updated_at"
        ],
        "title": "IntegrationTypeReadSchema",
        "type": "object"
      },
      "IntegrationUpdatedContextSchema": {
        "description": "Context for integration update.",
        "properties": {
          "changes": {
            "items": {
              "$ref": "#/components/schemas/FieldChangeSchema"
            },
            "title": "Changes",
            "type": "array"
          },
          "type": {
            "const": "updated",
            "default": "updated",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "changes"
        ],
        "title": "IntegrationUpdatedContextSchema",
        "type": "object"
      },
      "InviteOutcome": {
        "description": "Why a contact left a connection request by the branch it took.\n\nStored as the condition evaluation's ``reason`` beside the branch, because\nthe branch alone does not say enough: Not accepted covers an invitation\nthat expired, one that was declined, one nobody can answer any more, and\na request that could never be sent at all. The values up to\n``SENDER_CHANGED`` are answers (``ALREADY_CONNECTED`` the one known before\nany request went out); every value after it is a reason no request went\nout, and each one takes Not accepted.\n\n``ACCEPTED`` and ``ALREADY_CONNECTED`` take the Connected branch, the\nlatter its own branch when the request gives already-connected contacts\none. ``EXPIRED`` is an invitation still pending when its window closed,\n``DECLINED`` one a reading of the profile showed gone without a\nconnection (declined, or withdrawn by hand). ``SENDER_CHANGED`` is one\nnobody can answer any more: the sender's LinkedIn account was bound to\nanother member, or deleted, after it went out.",
        "enum": [
          "accepted",
          "already_connected",
          "expired",
          "declined",
          "sender_changed",
          "connect_not_offered",
          "email_required",
          "profile_not_resolved",
          "vanity_changed",
          "skipped_in_panel",
          "missed_window",
          "not_sent",
          "no_linkedin_url",
          "own_profile"
        ],
        "title": "InviteOutcome",
        "type": "string"
      },
      "InvoiceReadSchema": {
        "description": "One invoice in the organization's transaction history.",
        "properties": {
          "amount_due": {
            "description": "The amount due in cents.",
            "title": "Amount Due",
            "type": "integer"
          },
          "amount_paid": {
            "description": "The amount paid in cents.",
            "title": "Amount Paid",
            "type": "integer"
          },
          "created": {
            "description": "When the invoice was created.",
            "format": "date-time",
            "title": "Created",
            "type": "string"
          },
          "currency": {
            "description": "The three-letter ISO currency code.",
            "title": "Currency",
            "type": "string"
          },
          "hosted_invoice_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL of the hosted invoice page. None for draft invoices.",
            "title": "Hosted Invoice Url"
          },
          "id": {
            "description": "The Stripe invoice ID.",
            "title": "Id",
            "type": "string"
          },
          "invoice_pdf": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL of the invoice PDF. None for draft invoices.",
            "title": "Invoice Pdf"
          },
          "number": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The customer-facing invoice number. None until finalized.",
            "title": "Number"
          },
          "status": {
            "description": "The invoice status.",
            "enum": [
              "draft",
              "open",
              "paid",
              "uncollectible",
              "void"
            ],
            "title": "Status",
            "type": "string"
          }
        },
        "required": [
          "id",
          "status",
          "number",
          "amount_due",
          "amount_paid",
          "currency",
          "created",
          "hosted_invoice_url",
          "invoice_pdf"
        ],
        "title": "InvoiceReadSchema",
        "type": "object"
      },
      "JobTitleFilterSchema": {
        "description": "A phrase filter over job postings, capped at ten phrases each way.",
        "properties": {
          "exclude": {
            "items": {
              "type": "string"
            },
            "maxItems": 10,
            "title": "Exclude",
            "type": "array"
          },
          "include": {
            "items": {
              "type": "string"
            },
            "maxItems": 10,
            "title": "Include",
            "type": "array"
          }
        },
        "title": "JobTitleFilterSchema",
        "type": "object"
      },
      "KeptAnswerReadSchema": {
        "description": "An answer that was to be saved to the Q&A and is kept for this conversation instead.",
        "properties": {
          "question_id": {
            "description": "The question's id on the card.",
            "title": "Question Id",
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/KeptReason",
            "description": "Why: `names_contact`, its question or answer names the contact; `qa_full`, its question is new and the Q&A is full; `admin_only`, the Q&A holds another answer to it in that scope, which only a workspace admin can change."
          }
        },
        "required": [
          "question_id",
          "reason"
        ],
        "title": "KeptAnswerReadSchema",
        "type": "object"
      },
      "KeptReason": {
        "description": "Why an answer to be saved to the Q&A was kept for its conversation alone (2026-10-27).\n\n``NAMES_CONTACT``: its question or answer names the contact, so no other reply may\nread it. ``QA_FULL``: the question is new and the Q&A has no room. ``ADMIN_ONLY``: the\nQ&A holds a different answer to it in that scope, which only an admin may change.",
        "enum": [
          "names_contact",
          "qa_full",
          "admin_only"
        ],
        "title": "KeptReason",
        "type": "string"
      },
      "LabelCreateSchema": {
        "properties": {
          "color": {
            "default": "default",
            "maxLength": 16,
            "minLength": 1,
            "title": "Color",
            "type": "string"
          },
          "filtered_out": {
            "default": false,
            "title": "Filtered Out",
            "type": "boolean"
          },
          "icon": {
            "default": "",
            "maxLength": 32,
            "title": "Icon",
            "type": "string"
          },
          "name": {
            "maxLength": 64,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "track_as_positives": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Track As Positives"
          }
        },
        "required": [
          "name"
        ],
        "title": "LabelCreateSchema",
        "type": "object"
      },
      "LabelReadSchema": {
        "properties": {
          "color": {
            "title": "Color",
            "type": "string"
          },
          "filtered_out": {
            "default": false,
            "title": "Filtered Out",
            "type": "boolean"
          },
          "icon": {
            "default": "",
            "title": "Icon",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_seeded": {
            "default": false,
            "title": "Is Seeded",
            "type": "boolean"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "thread_count": {
            "title": "Thread Count",
            "type": "integer"
          },
          "track_as_positives": {
            "default": false,
            "title": "Track As Positives",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "name",
          "color",
          "thread_count"
        ],
        "title": "LabelReadSchema",
        "type": "object"
      },
      "LabelUpdateSchema": {
        "description": "Partial update of a label.\n\n`name` renames (seeded labels refuse, because their name is a contract);\n`track_as_positives` opts the label's threads in or out of the positive\nrate; `filtered_out` moves them out of (or back into) the working views.\nAll allowed on any label.",
        "properties": {
          "filtered_out": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filtered Out"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "track_as_positives": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Track As Positives"
          }
        },
        "title": "LabelUpdateSchema",
        "type": "object"
      },
      "LaunchCategory": {
        "description": "The buckets every board's own tags are mapped into, so one filter spans them all.\n\nFixed maps decide (``CATEGORY_OF_TAG`` plus each site's additions); a tag\nno map knows files an ``UNMAPPED_TAG`` report, never a guess.",
        "enum": [
          "ai",
          "developer_tools",
          "productivity",
          "marketing",
          "sales",
          "design",
          "finance",
          "ecommerce",
          "health",
          "education",
          "data",
          "security",
          "community",
          "hr",
          "consumer",
          "hardware",
          "industry"
        ],
        "title": "LaunchCategory",
        "type": "string"
      },
      "LaunchSource": {
        "description": "The launch boards and directories crawled, one ``crawler_<value>`` package each.",
        "enum": [
          "ycombinator",
          "betalist",
          "tinylaunch",
          "uneed",
          "microlaunch",
          "trustmrr",
          "hackernews",
          "producthunt"
        ],
        "title": "LaunchSource",
        "type": "string"
      },
      "LeadColumnKind": {
        "description": "How a column's values are shown: a \"url\" as a link, a \"date\" as a date, a \"list\" as its items.\n\nA display hint, not the type the column stores.",
        "enum": [
          "text",
          "number",
          "url",
          "date",
          "boolean",
          "list"
        ],
        "title": "LeadColumnKind",
        "type": "string"
      },
      "LeadColumnSchema": {
        "description": "One column of the table a search would create, and whether a preview shows it.",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/LeadColumnKind",
            "description": "How to show the values: text, number, url, date, boolean or list. A hint for drawing the header, not a promise about every cell."
          },
          "label": {
            "description": "The column's name, as the created table will call it.",
            "title": "Label",
            "type": "string"
          },
          "revealed": {
            "description": "Whether a preview carries this column's values. A column that is not revealed has no value in a preview row at all, rather than a hidden one, so there is nothing to blur on the page.",
            "title": "Revealed",
            "type": "boolean"
          }
        },
        "required": [
          "label",
          "kind",
          "revealed"
        ],
        "title": "LeadColumnSchema",
        "type": "object"
      },
      "LeadCountResponseSchema": {
        "description": "How many leads matched, and the most one search may add.",
        "properties": {
          "at_capacity": {
            "default": false,
            "description": "Whether `count` is the most one run of this search can return rather than a real match count. True means at least that many match, so show the number as a floor (\u201c100+ companies match\u201d) and say that one run returns up to `max_rows_per_import` of them. False means `count` is the real tally, however far above the run limit it sits.",
            "title": "At Capacity",
            "type": "boolean"
          },
          "count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many leads match. Null when this search type has no live count: buying-signal searches are sold by the row and have no free tally behind them, so the only way to see what one finds is to preview it. Lookalike, map and technographic searches all do count.",
            "title": "Count"
          },
          "max_rows_per_import": {
            "description": "The most rows one import adds for THIS organisation: the plan's rows per table, clamped by `max_rows_per_search`. Always a number, so anything quoting an import prices against this.",
            "title": "Max Rows Per Import",
            "type": "integer"
          },
          "max_rows_per_search": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The search's own ceiling on one run, before the plan: a Google search's searches times their depth. Null on every other search, where the plan's rows per table (`max_rows_per_import`) is the only bound, except where the deployment sets a guard on every search (a local environment).",
            "title": "Max Rows Per Search"
          },
          "provider_notices": {
            "description": "What qualifies this count, in the words to show beside it. A lookalike search with a minimum similarity fills this: the floor is applied to the matches once they arrive, after this count was taken, so the search can add fewer rows than `count`. Empty for every count that is exact.",
            "items": {
              "type": "string"
            },
            "title": "Provider Notices",
            "type": "array"
          },
          "row_order": {
            "description": "Which matches one run keeps when more match than it can add. `ranked` means it keeps the closest matches, so the rows added are the best ones. `recent` means it keeps the newest. `source_order` means it keeps the first `max_rows_per_import` the search returns, which is not a quality order and should never be described as one. Worth showing whenever `count` is larger than `max_rows_per_import`, so a five-row sample can be read for what it is.",
            "enum": [
              "ranked",
              "recent",
              "source_order"
            ],
            "title": "Row Order",
            "type": "string"
          },
          "supported": {
            "default": true,
            "description": "Whether counting is available for this search type. False means `count` is null for every set of filters, not just this one.",
            "title": "Supported",
            "type": "boolean"
          }
        },
        "required": [
          "count",
          "max_rows_per_search",
          "max_rows_per_import",
          "row_order"
        ],
        "title": "LeadCountResponseSchema",
        "type": "object"
      },
      "LeadEnrichmentOption": {
        "description": "An enrichment offered at import, in the user's vocabulary not the catalog's.\n\nEach option names an outcome and resolves to the curated enrichment that\ndelivers it, so importing leads stays a question about what you want\nrather than about who supplies it.\n\nKept as its own enum rather than reusing the capability keys directly:\nthe import page offers a deliberately short list, and which enrichments\nbelong on it is a product decision that should not change every time the\ncatalog gains a capability.",
        "enum": [
          "find_email",
          "find_phone",
          "enrich_contact",
          "enrich_company"
        ],
        "title": "LeadEnrichmentOption",
        "type": "string"
      },
      "LeadEnrichmentOptionSchema": {
        "description": "One enrichment that applies at import: priced against the live catalog when it can run.\n\nAn option that applies but cannot run right now (parked for every workspace, or not in\nthis deployment) is a row of the same list with ``available`` false and no price, so a\npicker can keep it in its place, disabled, rather than drop it.",
        "properties": {
          "already_covered": {
            "description": "Whether the search's own column plan already has a column named exactly this. Ticking the option regardless still adds a second column, suffixed to stay unique: the two are never merged.",
            "title": "Already Covered",
            "type": "boolean"
          },
          "available": {
            "description": "Whether it can be chosen. False means it applies to this search but is not available right now, for any workspace: it carries no price, and an import that asks for it is refused.",
            "title": "Available",
            "type": "boolean"
          },
          "column_display_name": {
            "description": "What the column this creates will be called.",
            "title": "Column Display Name",
            "type": "string"
          },
          "credits_for_rows": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the requested row count usually costs (credits_per_row times the rows); null if none was given, or when it is not available.",
            "title": "Credits For Rows"
          },
          "credits_per_row": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a row that gets an answer usually costs: each row is charged the price of the source that answered it, read from which sources usually answer. Equal to max_credits_per_row when every source has one price. A row nobody can answer for is free. Null when it is not available.",
            "title": "Credits Per Row"
          },
          "description": {
            "title": "Description",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "key": {
            "$ref": "#/components/schemas/LeadEnrichmentOption"
          },
          "max_credits_per_row": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The most one row could cost (the dearest source), what the credit hold reserves. Quote it after credits_per_row: about that, up to this. Null when it is not available.",
            "title": "Max Credits Per Row"
          }
        },
        "required": [
          "key",
          "display_name",
          "description",
          "column_display_name",
          "already_covered",
          "available",
          "credits_per_row",
          "max_credits_per_row"
        ],
        "title": "LeadEnrichmentOptionSchema",
        "type": "object"
      },
      "LeadPreviewResponseSchema": {
        "description": "A taste of the table a search would build, plus the size of the whole set.\n\nThe rows carry only the revealed columns. Everything else about a lead,\nemail included, stays on the server until the search becomes a table.",
        "properties": {
          "already_in_tables": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many of the sample `rows` are people another of your tables already holds. A people search leaves them out unless `include_people_already_in_tables` is set, so this says what that choice decides before anything is added. Null for every other search.",
            "title": "Already In Tables"
          },
          "columns": {
            "description": "The columns a table built from these sample leads would show, in order, with `revealed` saying which ones the rows below carry. Decided the way the import decides them: a column no sample lead fills is left out, and a person's name stands as one `Name` column only when both halves were found, otherwise under the half's own label. Draw the header from this and leave the unrevealed cells empty. A search that adds more leads than the sample can fill a column the sample left out.",
            "items": {
              "$ref": "#/components/schemas/LeadColumnSchema"
            },
            "title": "Columns",
            "type": "array"
          },
          "earlier_table": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EarlierLeadTableSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A table this same search (the same filters) already built, when it still exists, so a second copy is not made by mistake."
          },
          "provider_notices": {
            "description": "What the data source said about the answer, in its own words. The signals data source narrows the scanned window to the most recent 14 days whenever an industry, size, revenue or job filter is set, and says so here rather than in the rows. Empty for every other search.",
            "items": {
              "type": "string"
            },
            "title": "Provider Notices",
            "type": "array"
          },
          "row_refs": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Per row of `rows`, in order, the ref a search names it by: a people search's `excluded_people` to leave that person out, a lookalike search's `seed_rows` to seed it with that company. Null for a row that cannot be named, and the whole list null for a search whose rows cannot.",
            "title": "Row Refs"
          },
          "rows": {
            "description": "At most five sample leads, each a map from a revealed column's label to its value as text, blank where the lead has none. For a people search that is the person's name, job title and company; for a company search, the company's name. No other value is sent, and email is never among them: finding it is what an enrichment does once the search is a table.",
            "items": {
              "additionalProperties": {
                "type": "string"
              },
              "type": "object"
            },
            "title": "Rows",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "total",
          "columns",
          "rows"
        ],
        "title": "LeadPreviewResponseSchema",
        "type": "object"
      },
      "LeadRecordType": {
        "description": "Which dataset a search runs against, and so which provider serves it.\n\nValues are persisted in String(16) columns, so every member must stay\nwithin 16 characters.",
        "enum": [
          "people",
          "companies",
          "signal_companies",
          "signal_people",
          "lookalikes",
          "local_businesses",
          "hiring_companies",
          "backlinks",
          "search_results",
          "post_authors",
          "startup_launches"
        ],
        "title": "LeadRecordType",
        "type": "string"
      },
      "LeadRecordTypeReadSchema": {
        "description": "One kind of lead search: what its rows cost, and whether it can be sampled first.\n\nThe two facts a builder needs before anything is spent, read for free and\nwithout fetching a row: asking the price must never itself cost a row.",
        "properties": {
          "credits_for_rows": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "What `row_count` rows cost before any enrichment, request charges included and rounded once on the total; null if no `row_count` was given. The rows a run adds are what gets charged, so a run that matches fewer rows than asked for costs less than this.",
            "title": "Credits For Rows"
          },
          "credits_per_request": {
            "description": "What each request to the data source costs on top of its rows, in credits, charged once for every `rows_per_request` rows a run adds (a Google search: 0.1 credit for every ten results). Zero for the search types billed by the row alone.",
            "title": "Credits Per Request",
            "type": "number"
          },
          "credits_per_row": {
            "description": "What one row of this search type costs, in credits, before any enrichment is chosen. Zero for the search types whose rows are free. Charged on the rows a run adds, so a run that adds nothing costs nothing. Never included in an enrichment's `credits_per_row`, so a true total is this plus the ticked enrichments rather than either alone.",
            "title": "Credits Per Row",
            "type": "number"
          },
          "preview_supported": {
            "description": "Whether this search type can be sampled before it is added. The backend lists which datasets offer an explicit sample. This is independent of row pricing; automatic counts are only available when the data source counts for free.",
            "title": "Preview Supported",
            "type": "boolean"
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType",
            "description": "Which dataset the search runs against."
          },
          "rows_per_request": {
            "description": "How many rows one request to the data source returns, and so how many each request charge covers.",
            "title": "Rows Per Request",
            "type": "integer"
          }
        },
        "required": [
          "record_type",
          "credits_per_row",
          "credits_per_request",
          "rows_per_request",
          "preview_supported"
        ],
        "title": "LeadRecordTypeReadSchema",
        "type": "object"
      },
      "LeadSearchAttachPreviewSchema": {
        "description": "What putting a search behind a table sets off in the table's own columns, before it runs.",
        "properties": {
          "estimated_credits": {
            "description": "The most the table's own columns can cost on the new rows: the columns that run automatically on new rows and read the column the rows land in. Beside the rows' own price and the enrichments the request ticks, which are priced as for a new table. Zero when none of the table's columns would run.",
            "title": "Estimated Credits",
            "type": "number"
          },
          "expected_credits": {
            "description": "What those columns usually cost on the new rows; never above `estimated_credits`. Quote both, this first.",
            "title": "Expected Credits",
            "type": "number"
          },
          "has_search": {
            "description": "The table already has a search. A table carries one, so putting another behind it is refused (409); add rows from its own search with `more_rows` on its run instead.",
            "title": "Has Search",
            "type": "boolean"
          }
        },
        "required": [
          "has_search",
          "estimated_credits",
          "expected_credits"
        ],
        "title": "LeadSearchAttachPreviewSchema",
        "type": "object"
      },
      "LeadSearchCadence": {
        "description": "How often a table's search runs on its own: on a calendar step, or every few days.",
        "enum": [
          "daily",
          "weekly",
          "monthly",
          "quarterly",
          "custom"
        ],
        "title": "LeadSearchCadence",
        "type": "string"
      },
      "LeadSearchHistoryEntrySchema": {
        "description": "One automatically recorded search run.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "query": {
            "additionalProperties": true,
            "title": "Query",
            "type": "object"
          },
          "ran_at": {
            "format": "date-time",
            "title": "Ran At",
            "type": "string"
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "rows_created": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rows an import added; null when the search was only browsed.",
            "title": "Rows Created"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table an import added rows to, when one did.",
            "title": "Table Id"
          },
          "total_matched": {
            "title": "Total Matched",
            "type": "integer"
          },
          "user_id": {
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "user_id",
          "record_type",
          "query",
          "total_matched",
          "rows_created",
          "table_id",
          "ran_at"
        ],
        "title": "LeadSearchHistoryEntrySchema",
        "type": "object"
      },
      "LeadSearchReplaceImpactRequestSchema": {
        "description": "A table's search as it would be saved, and how its run would be sized.\n\nThe body the search's PUT takes, so the confirm dialog asks about exactly\nwhat it is about to save, plus the run's own `more_rows` or `max_new_rows`.",
        "properties": {
          "backlinks": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinksQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "enrichments": {
            "description": "What to find out about the rows this adds. Each becomes its own column, and each is billed per row that comes back with an answer.",
            "items": {
              "$ref": "#/components/schemas/LeadEnrichmentOption"
            },
            "maxItems": 4,
            "title": "Enrichments",
            "type": "array"
          },
          "hiring_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HiringCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "include_people_already_in_tables": {
            "default": false,
            "description": "A people search only. By default it leaves out the people who already have a row in one of the workspace's other tables, and keeps looking until enough new people are added; the response says how many it skipped. Set true to add them again.",
            "title": "Include People Already In Tables",
            "type": "boolean"
          },
          "local_businesses": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LocalBusinessQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "lookalikes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LookalikeQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "max_new_rows": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The most rows the run would add, as `max_new_rows` on the run.",
            "title": "Max New Rows"
          },
          "more_rows": {
            "anyOf": [
              {
                "maximum": 1000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many new rows the run would add, as `more_rows` on the run.",
            "title": "More Rows"
          },
          "only": {
            "anyOf": [
              {
                "enum": [
                  "attach",
                  "replace"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hold the request to one of its two effects. `attach` puts the search behind a table that has none and runs it, and answers 409 when the table has one. `replace` changes the criteria of the search the table has, and answers 404 when it has none, so nothing runs and nothing is charged. Leave it out to do whichever fits.",
            "title": "Only"
          },
          "people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "post_authors": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PostAuthorsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "row_limit": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rows to add. Clamped further by the organisation's plan cap; omit for the maximum.",
            "title": "Row Limit"
          },
          "search_results": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SearchResultsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalPeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "startup_launches": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StartupLaunchesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "record_type"
        ],
        "title": "LeadSearchReplaceImpactRequestSchema",
        "type": "object"
      },
      "LeadSearchReplaceImpactSchema": {
        "description": "What running a table's search with `replace` would add, delete and stop, before it runs.",
        "properties": {
          "contacts_mid_conversation": {
            "description": "Of `contacts_stopping`, those already contacted or who replied, so a conversation would end part way.",
            "title": "Contacts Mid Conversation",
            "type": "integer"
          },
          "contacts_stopping": {
            "description": "Contacts on those rows that are still in a sequence and would stop.",
            "title": "Contacts Stopping",
            "type": "integer"
          },
          "linked_tables": {
            "description": "For a company search, each people table whose search follows this table and the people the run would delete from it: those whose Company link points only at companies it deletes. Empty otherwise. Their contacts are in `contacts_stopping`.",
            "items": {
              "$ref": "#/components/schemas/LeadSearchReplaceLinkedTableSchema"
            },
            "title": "Linked Tables",
            "type": "array"
          },
          "paid_credits": {
            "description": "What that data cost when it was bought, in credits.",
            "title": "Paid Credits",
            "type": "number"
          },
          "replace_supported": {
            "description": "Whether this search can replace the table's rows. Only people and company searches can; a run with `replace` on any other answers 422.",
            "title": "Replace Supported",
            "type": "boolean"
          },
          "rows_to_add": {
            "description": "The most rows the run adds: the matches the table does not hold yet, within the run's row limit and the table's room.",
            "title": "Rows To Add",
            "type": "integer"
          },
          "rows_to_remove": {
            "description": "Rows the run deletes after adding: rows added by hand or from a file, rows from another kind of search, and rows the search no longer matches. 0 when `replace_supported` is false.",
            "title": "Rows To Remove",
            "type": "integer"
          },
          "rows_with_paid_data": {
            "description": "Of every row the run would delete, linked tables' included, how many hold data paid for with credits (an enrichment or agent cell). It is deleted too.",
            "title": "Rows With Paid Data",
            "type": "integer"
          },
          "sequences": {
            "description": "The sequences those contacts are in, the most contacts first.",
            "items": {
              "$ref": "#/components/schemas/LeadSearchReplaceSequenceSchema"
            },
            "title": "Sequences",
            "type": "array"
          }
        },
        "required": [
          "replace_supported",
          "rows_to_add",
          "rows_to_remove",
          "contacts_stopping",
          "contacts_mid_conversation",
          "sequences",
          "linked_tables",
          "rows_with_paid_data",
          "paid_credits"
        ],
        "title": "LeadSearchReplaceImpactSchema",
        "type": "object"
      },
      "LeadSearchReplaceLinkedTableSchema": {
        "description": "One people table a company search's Replace would delete people from.",
        "properties": {
          "name": {
            "description": "The people table's name.",
            "title": "Name",
            "type": "string"
          },
          "rows_to_remove": {
            "description": "People in it whose Company link points only at companies the run deletes.",
            "title": "Rows To Remove",
            "type": "integer"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "name",
          "rows_to_remove"
        ],
        "title": "LeadSearchReplaceLinkedTableSchema",
        "type": "object"
      },
      "LeadSearchReplaceSequenceSchema": {
        "description": "One sequence whose contacts a Replace run would stop.",
        "properties": {
          "contacts": {
            "description": "Contacts in it on rows the run would delete.",
            "title": "Contacts",
            "type": "integer"
          },
          "name": {
            "description": "The sequence's name, as its page shows it.",
            "title": "Name",
            "type": "string"
          },
          "sequence_id": {
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          }
        },
        "required": [
          "sequence_id",
          "name",
          "contacts"
        ],
        "title": "LeadSearchReplaceSequenceSchema",
        "type": "object"
      },
      "LeadSearchRequestSchema": {
        "description": "A search request.\n\nEvery query shape is accepted on every request and the record type picks\nwhich one is read, so the client can keep a draft of each while the user\nmoves between the search types without losing what they typed.\n\nEach field is named exactly for the record type that reads it. A stored\nsearch is re-run by rebuilding the request as\n``{\"record_type\": rt, rt: query}``, which only holds while that stays true.",
        "properties": {
          "backlinks": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinksQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "hiring_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HiringCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "local_businesses": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LocalBusinessQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "lookalikes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LookalikeQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "post_authors": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PostAuthorsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "search_results": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SearchResultsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalPeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "startup_launches": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StartupLaunchesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "record_type"
        ],
        "title": "LeadSearchRequestSchema",
        "type": "object"
      },
      "LeadSearchRunLogSchema": {
        "description": "One recorded execution of a table's search.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "max_new_rows": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The most NEW rows the run may add, for a run capped at a number: `more_rows` or `max_new_rows` on the run (10 more on a table of 200 reads 210 deep and adds 10 at most), or an import that walks past people already in the workspace's tables. Null for an uncapped run.",
            "title": "Max New Rows"
          },
          "provider_notices": {
            "description": "What the data source said about the rows this run added, in the words to show beside them, gathered from every batch and each said once. A buying-signal search narrowed to its last 14 days says so here, and so does a hiring search that stopped at its limit of job postings. Empty for a run nothing qualified.",
            "items": {
              "type": "string"
            },
            "title": "Provider Notices",
            "type": "array"
          },
          "rows_created": {
            "description": "Rows this run has added to the table so far.",
            "title": "Rows Created",
            "type": "integer"
          },
          "rows_fetched": {
            "default": 0,
            "description": "Rows the data source has handed over so far, whether new to the table or already in it. Reaches `rows_wanted` when the run is done.",
            "title": "Rows Fetched",
            "type": "integer"
          },
          "rows_not_added": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RowsNotAddedSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The people the search found that are not rows, and why, once every row is in: `found_twice` when the people search holds one person under two records, so a new table took them once; `already_in_table` when a person found was already a row of the table. Null when every person found was added, or while rows are still being added."
          },
          "rows_wanted": {
            "default": 0,
            "description": "How far into the search's matches the run reads; the denominator for a progress bar. Never more than `total_matched` where the data source counts its matches; where it cannot, the most the run may read. On a run capped at a number of new rows it counts the rows already in the table too, so `max_new_rows` is what it may add.",
            "title": "Rows Wanted",
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/LeadSearchRunStatus",
            "description": "`running` while a background import is still adding rows to the table, then `success` or `failed`."
          },
          "total_matched": {
            "title": "Total Matched",
            "type": "integer"
          },
          "trigger": {
            "$ref": "#/components/schemas/LeadSearchRunTrigger"
          },
          "updated_at": {
            "description": "When the run last made progress.",
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "status",
          "trigger",
          "rows_created",
          "total_matched",
          "error",
          "created_at",
          "updated_at"
        ],
        "title": "LeadSearchRunLogSchema",
        "type": "object"
      },
      "LeadSearchRunPreviewSchema": {
        "description": "What running a table's search with `more_rows` would add and cost, before it runs.",
        "properties": {
          "columns_estimated_credits": {
            "default": 0.0,
            "description": "The part of `estimated_credits` the table's own columns fill on the new rows, the ones that run automatically on new rows, beside the rows' own price. Zero when only the rows are priced.",
            "title": "Columns Estimated Credits",
            "type": "number"
          },
          "estimated_credits": {
            "description": "The most the run can cost: the rows, and the cells the table's own columns fill for them, every enrichment at its dearest source. What the run is gated on.",
            "title": "Estimated Credits",
            "type": "number"
          },
          "expected_credits": {
            "description": "What a run like it usually costs: every enrichment at what an answered row usually costs. Equal to `estimated_credits` when the price is flat; never above it. Quote both, this first: about expected_credits, up to estimated_credits.",
            "title": "Expected Credits",
            "type": "number"
          },
          "rows": {
            "description": "The most rows the run may add: the number asked for, within the search's own cap and the room left in the table.",
            "title": "Rows",
            "type": "integer"
          }
        },
        "required": [
          "rows",
          "estimated_credits",
          "expected_credits"
        ],
        "title": "LeadSearchRunPreviewSchema",
        "type": "object"
      },
      "LeadSearchRunResponseSchema": {
        "description": "What one re-run of a table's search changed.",
        "properties": {
          "column_notes": {
            "description": "What the search did to the table's columns beyond its rows, one sentence each, to show beside the result: a column it made that links each person to their company's row in the table the search follows. Empty when it made none.",
            "items": {
              "type": "string"
            },
            "title": "Column Notes",
            "type": "array"
          },
          "import_status": {
            "$ref": "#/components/schemas/LeadSearchRunStatus",
            "default": "success",
            "description": "`running` when the request added a first batch and the rest is still being added in the background, so poll the table's search runs for progress; `success` when every row is in."
          },
          "linked_rows_deleted": {
            "default": 0,
            "description": "People a company search's `replace` deleted from the people tables whose search follows this table, because every company their Company link points at was deleted; their contacts stop in every sequence. 0 otherwise.",
            "title": "Linked Rows Deleted",
            "type": "integer"
          },
          "people_skipped": {
            "default": 0,
            "description": "People the request left out because another of the workspace's tables already has them. A run that continues in the background goes on skipping them.",
            "title": "People Skipped",
            "type": "integer"
          },
          "provider_notices": {
            "description": "What the data source said about the rows the request added, in the words to show beside them; see the create response. A run that continues in the background can add more, and the table's search runs carry every one.",
            "items": {
              "type": "string"
            },
            "title": "Provider Notices",
            "type": "array"
          },
          "rows_created": {
            "description": "Rows the request itself added.",
            "title": "Rows Created",
            "type": "integer"
          },
          "rows_deleted": {
            "default": 0,
            "description": "Rows a run with `replace` deleted after adding, because the search no longer matches them; their contacts stop in every sequence. 0 for a run that only adds.",
            "title": "Rows Deleted",
            "type": "integer"
          },
          "rows_not_added": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RowsNotAddedSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The people the search found that are not rows, and why, once every row is in: `found_twice` when the people search holds one person under two records, so a new table took them once; `already_in_table` when a person found was already a row of the table. Null when every person found was added, or while rows are still being added."
          },
          "rows_wanted": {
            "default": 0,
            "description": "How far into the search's matches the run reads: never more than `total_matched` where the data source counts its matches. On a run with `more_rows` it counts the rows already in the table too (10 more on a table of 200 reads 210 deep). A run that added nobody read every match when `total_matched` is no more than this; otherwise the matches it read are already in the table, and after a `more_rows` run the search's reach ends past them, so the next one reads further.",
            "title": "Rows Wanted",
            "type": "integer"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The run row recording this import, when the search is persisted.",
            "title": "Run Id"
          },
          "skip_limit_reached": {
            "default": false,
            "description": "Whether the search stopped looking after skipping as many people as one search may, so fewer rows may be added than asked for.",
            "title": "Skip Limit Reached",
            "type": "boolean"
          },
          "total_matched": {
            "title": "Total Matched",
            "type": "integer"
          }
        },
        "required": [
          "rows_created",
          "total_matched"
        ],
        "title": "LeadSearchRunResponseSchema",
        "type": "object"
      },
      "LeadSearchRunStatus": {
        "description": "Where one run of a table's search stands.\n\n``running`` while rows are still being added, then ``success`` or ``failed``.",
        "enum": [
          "running",
          "success",
          "failed"
        ],
        "title": "LeadSearchRunStatus",
        "type": "string"
      },
      "LeadSearchRunTrigger": {
        "description": "What started a run of a table's search.",
        "enum": [
          "create",
          "attach",
          "manual",
          "schedule"
        ],
        "title": "LeadSearchRunTrigger",
        "type": "string"
      },
      "LeadSearchScheduleRequestSchema": {
        "description": "A search's run cadence. Returning it to manual runs is deleting the schedule.",
        "properties": {
          "at_minutes": {
            "anyOf": [
              {
                "maximum": 1439.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "At Minutes"
          },
          "cadence": {
            "$ref": "#/components/schemas/LeadSearchCadence"
          },
          "every_days": {
            "anyOf": [
              {
                "maximum": 365.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Every Days"
          },
          "starts_on": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The first day the schedule may run, as YYYY-MM-DD in `timezone`. Nothing runs before it, and next_runs count from it. Null, or a day already past, starts at once.",
            "title": "Starts On"
          },
          "timezone": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Timezone"
          }
        },
        "required": [
          "cadence"
        ],
        "title": "LeadSearchScheduleRequestSchema",
        "type": "object"
      },
      "LeadSearchScheduleResponseSchema": {
        "description": "The scheduled search, plus its next few firings for preview.",
        "properties": {
          "next_runs": {
            "items": {
              "format": "date-time",
              "type": "string"
            },
            "title": "Next Runs",
            "type": "array"
          },
          "source": {
            "$ref": "#/components/schemas/LeadSearchSourceResponseSchema"
          }
        },
        "required": [
          "source",
          "next_runs"
        ],
        "title": "LeadSearchScheduleResponseSchema",
        "type": "object"
      },
      "LeadSearchSourceResponseSchema": {
        "description": "The persisted search behind a table, in the request's own shape.",
        "properties": {
          "company_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a company search: the table's column of company websites the search landed, which a people search follows as `company_table` to find the people at these companies. Found by what the column reads, so a rename keeps it. Null for any other search, or when that column was deleted.",
            "title": "Company Column Id"
          },
          "max_rows_per_search": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Kept for older screens; null in production. No search has a ceiling on one run of its own: a run is bounded by the plan's rows per table, the search's row limit (or the rows asked for), and where the matches end. A number only where the deployment sets a guard on every search (a local environment). One run with `more_rows` adds no more than the room left in the table.",
            "title": "Max Rows Per Search"
          },
          "next_run_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Run At"
          },
          "query": {
            "additionalProperties": true,
            "title": "Query",
            "type": "object"
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "row_limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Row Limit"
          },
          "schedule_at_minutes": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Schedule At Minutes"
          },
          "schedule_cadence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LeadSearchCadence"
              },
              {
                "type": "null"
              }
            ]
          },
          "schedule_every_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Schedule Every Days"
          },
          "schedule_starts_on": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The first day the schedule may run, in its own timezone; null when it started at once.",
            "title": "Schedule Starts On"
          },
          "schedule_timezone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Schedule Timezone"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "record_type",
          "query",
          "row_limit",
          "schedule_cadence",
          "schedule_every_days",
          "schedule_at_minutes",
          "schedule_timezone",
          "next_run_at",
          "updated_at"
        ],
        "title": "LeadSearchSourceResponseSchema",
        "type": "object"
      },
      "LeadSearchSuggestionListResponseSchema": {
        "description": "Starter searches worth clicking before any filters exist.",
        "properties": {
          "suggestions": {
            "items": {
              "$ref": "#/components/schemas/LeadSearchSuggestionSchema"
            },
            "title": "Suggestions",
            "type": "array"
          },
          "tailored": {
            "description": "True when the suggestions were written from the workspace's business context. False for the standard starters every workspace gets while its business context is empty, or when nothing tailored could be written from it.",
            "title": "Tailored",
            "type": "boolean"
          }
        },
        "required": [
          "suggestions",
          "tailored"
        ],
        "title": "LeadSearchSuggestionListResponseSchema",
        "type": "object"
      },
      "LeadSearchSuggestionSchema": {
        "description": "One clickable starter search, filters in the request's own shape.",
        "properties": {
          "label": {
            "title": "Label",
            "type": "string"
          },
          "query": {
            "additionalProperties": true,
            "title": "Query",
            "type": "object"
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          }
        },
        "required": [
          "label",
          "record_type",
          "query"
        ],
        "title": "LeadSearchSuggestionSchema",
        "type": "object"
      },
      "LeadSignalTypeGroupSchema": {
        "description": "One heading in the signal picker, and the signals filed under it.",
        "properties": {
          "group": {
            "title": "Group",
            "type": "string"
          },
          "types": {
            "items": {
              "$ref": "#/components/schemas/LeadSignalTypeSchema"
            },
            "title": "Types",
            "type": "array"
          }
        },
        "required": [
          "group",
          "types"
        ],
        "title": "LeadSignalTypeGroupSchema",
        "type": "object"
      },
      "LeadSignalTypeSchema": {
        "description": "One buying signal a signals search can look for.",
        "properties": {
          "association": {
            "description": "Whether the signal attaches to a company or to a person.",
            "title": "Association",
            "type": "string"
          },
          "content_filterable": {
            "description": "Whether this signal carries text, and so whether the `content_*` filters narrow anything when it is chosen.",
            "title": "Content Filterable",
            "type": "boolean"
          },
          "key": {
            "description": "What to send back in `signal_types`.",
            "title": "Key",
            "type": "string"
          },
          "label": {
            "description": "What to call it on screen.",
            "title": "Label",
            "type": "string"
          },
          "subtypes": {
            "description": "Narrower kinds within this signal, for the ones that have any.",
            "items": {
              "type": "string"
            },
            "title": "Subtypes",
            "type": "array"
          }
        },
        "required": [
          "key",
          "label",
          "association",
          "content_filterable"
        ],
        "title": "LeadSignalTypeSchema",
        "type": "object"
      },
      "LeadTableNameRequestSchema": {
        "description": "A search to name a table after, with the builder's picks and the viewer's zone.\n\nThe builder offers seniority, job function and region as picks, and a\nsearch sends each one as what it stands for: job titles, or a region's\ncountries. The first of those names a search badly (\"Founder\" for a\nC-suite search, \"United States\" for North America), so the picks travel\nhere by name instead, and the name reads them.",
        "properties": {
          "backlinks": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinksQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "hiring_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HiringCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "job_functions": {
            "description": "The job functions a people search was built from ('Sales', 'Engineering'), on the same terms as `seniority`.",
            "items": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 200,
            "title": "Job Functions",
            "type": "array"
          },
          "local_businesses": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LocalBusinessQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "lookalikes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LookalikeQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "post_authors": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PostAuthorsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "regions": {
            "description": "The regions a people or company search's places were picked as, as the builder names them ('NAM (North America)'). The first names the place in place of the countries it stands for. Ignored on every other search.",
            "items": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 200,
            "title": "Regions",
            "type": "array"
          },
          "search_results": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SearchResultsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "seniority": {
            "description": "The seniority levels a people search was built from, as the builder names them ('C-suite', 'VP'). Leave the job titles they stand for out of `people.job_title`, or the first of those titles names the table too. Ignored on every other search.",
            "items": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 200,
            "title": "Seniority",
            "type": "array"
          },
          "signal_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalPeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "startup_launches": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StartupLaunchesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "timezone": {
            "default": "UTC",
            "description": "The viewer's IANA time zone, such as Europe/Berlin. A search named by nothing else is dated with today's date there.",
            "maxLength": 64,
            "minLength": 1,
            "title": "Timezone",
            "type": "string"
          }
        },
        "required": [
          "record_type"
        ],
        "title": "LeadTableNameRequestSchema",
        "type": "object"
      },
      "LeadValueMatchSchema": {
        "description": "One value's outcome against the vocabulary it was checked against.",
        "properties": {
          "exact_match": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The vocabulary's own spelling, when the value was already in it once case and surrounding space are folded away.",
            "title": "Exact Match"
          },
          "suggested_match": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The vocabulary entry this value most likely means, when it was not an exact match and something close enough exists.",
            "title": "Suggested Match"
          },
          "value": {
            "description": "The value as it was sent.",
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value"
        ],
        "title": "LeadValueMatchSchema",
        "type": "object"
      },
      "LeadVocabularyField": {
        "description": "One of the search fields whose values a closed vocabulary decides.\n\nValues are the same names the request schemas already give these fields\n(``PeopleQuerySchema.departments``, and ``FieldSpec.apiFilter`` on the\nfrontend, which pins a provider complaint to the box the person typed\nin), so matching a value for a field names it exactly as every other\nsurface already does.\n\n``PeopleQuerySchema.company_type`` (a person's current/past employer's\ntype) and ``CompanyQuerySchema.company_type`` (the Companies search's own\nfield) both name themselves ``company_type`` AND share one member here:\nthe People search's employer type is the same eight values as the\nCompanies search's own type (``CLEAN_COMPANY_TYPES``; see its own\ncomment), confirmed independently on both indexes, so one entry serves\nboth schemas' ``company_type``/``past_company_type`` fields.",
        "enum": [
          "departments",
          "past_departments",
          "management_levels",
          "past_management_levels",
          "company_size_bands",
          "department",
          "company_industry",
          "past_company_industry",
          "industry",
          "company_type",
          "past_company_type"
        ],
        "title": "LeadVocabularyField",
        "type": "string"
      },
      "LearnState": {
        "description": "Whether a session's learner turned its notes into changes (F3, F5).",
        "enum": [
          "ok",
          "failed"
        ],
        "title": "LearnState",
        "type": "string"
      },
      "LearnedPartReadSchema": {
        "description": "One more learning a thumbs down wrote, for another point its reason made.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/LearningAction",
            "description": "`added` a learning, or `updated` one about the same thing."
          },
          "learning_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning; null once it was deleted.",
            "title": "Learning Id"
          },
          "previous_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the updated learning said before; null for an added one.",
            "title": "Previous Text"
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning as the thumbs down wrote it.",
            "title": "Text"
          }
        },
        "required": [
          "action",
          "learning_id",
          "text",
          "previous_text"
        ],
        "title": "LearnedPartReadSchema",
        "type": "object"
      },
      "LearningAction": {
        "description": "What one event did to an agent's learnings.",
        "enum": [
          "added",
          "updated",
          "split",
          "carried",
          "skipped",
          "seeded",
          "session",
          "deleted"
        ],
        "title": "LearningAction",
        "type": "string"
      },
      "LearningEventStatus": {
        "description": "Where an event stands.\n\nA thumbs down starts ``proposed``: the learner's learning waits, on the rewritten message\nor on the cells or Preview example it runs again (FS-18), until a person saves it\n(``applied``) or it is thrown away (``dismissed``). Older table learnings, saved at once,\nstay ``applied``.",
        "enum": [
          "applied",
          "undone",
          "proposed",
          "dismissed"
        ],
        "title": "LearningEventStatus",
        "type": "string"
      },
      "LearningOutcome": {
        "description": "What undoing an event did to its learning.",
        "enum": [
          "removed",
          "restored",
          "left"
        ],
        "title": "LearningOutcome",
        "type": "string"
      },
      "LearningOverlapReadSchema": {
        "description": "Where the workspace's sequences keep the same rule each for themselves (F16).",
        "properties": {
          "account_full": {
            "description": "All sequences keep 30 learnings already: a rule they do not keep yet can't move there until one is deleted.",
            "title": "Account Full",
            "type": "boolean"
          },
          "rules": {
            "description": "The rules two or more sequences each keep, word for word, most-shared first. A rule naming one step is that sequence's alone and is never one.",
            "items": {
              "$ref": "#/components/schemas/SharedLearningReadSchema"
            },
            "title": "Rules",
            "type": "array"
          }
        },
        "required": [
          "rules",
          "account_full"
        ],
        "title": "LearningOverlapReadSchema",
        "type": "object"
      },
      "LearningRequestErrorCode": {
        "description": "Why a learning request failed: what the one-request route it stands for refuses.",
        "enum": [
          "reason_required",
          "nothing_learned",
          "not_found",
          "event_not_found",
          "refused",
          "limit_reached",
          "unavailable",
          "timed_out",
          "error"
        ],
        "title": "LearningRequestErrorCode",
        "type": "string"
      },
      "LearningRequestErrorReadSchema": {
        "description": "Why a learning request given in the background failed.",
        "properties": {
          "code": {
            "$ref": "#/components/schemas/LearningRequestErrorCode",
            "description": "`reason_required` or `nothing_learned` (about the reason), `not_found` (what it was given on is gone), `event_not_found` (the proposed learning it acts on is gone), `refused` (it can't be done here, the sentence says why), `limit_reached` (today's free rewrites are spent), `unavailable` (the agent could not read a hand edit right now), `timed_out` (the agent didn't finish learning within two minutes; nothing was saved) or `error`. Every one can be sent again with the same `request_id`."
          },
          "detail": {
            "description": "The sentence to show.",
            "title": "Detail",
            "type": "string"
          },
          "reason_error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sentence to show under the reason box; null when not about the reason.",
            "title": "Reason Error"
          },
          "status": {
            "description": "The HTTP status the one-request route it stands for answers it with.",
            "title": "Status",
            "type": "integer"
          }
        },
        "required": [
          "code",
          "status",
          "detail",
          "reason_error"
        ],
        "title": "LearningRequestErrorReadSchema",
        "type": "object"
      },
      "LearningRequestKind": {
        "description": "What a learning request given in the background runs: each one-request route it stands for.\n\nThe learner can take longer than the load balancer keeps a request open (30 seconds), so\nevery press of the dashboard's that asks it goes through a request instead.",
        "enum": [
          "thumbs_down",
          "hand_edit",
          "regenerate",
          "proposal_change"
        ],
        "title": "LearningRequestKind",
        "type": "string"
      },
      "LearningRequestReadSchema": {
        "description": "A learning request given in the background, and where it stands.",
        "properties": {
          "answer": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ThumbsDownReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Once `done`: what it did, as `POST /agent-learnings/thumbs-downs/` answers; for a Retry or a change, the proposed learning it acted on, as it now stands. On a proposal from an edit, `proposal` is null when the words came back to the agent's and the learning proposed from an earlier edit was dismissed."
          },
          "error": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LearningRequestErrorReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Once `failed`: why."
          },
          "kind": {
            "$ref": "#/components/schemas/LearningRequestKind",
            "description": "What it runs, as it was sent."
          },
          "request_id": {
            "description": "The key it was sent under, to ask again by.",
            "format": "uuid",
            "title": "Request Id",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/LearningRequestState",
            "description": "`running` while the agent learns (ask again in a couple of seconds), then `done` with `answer`, or `failed` with `error`."
          }
        },
        "required": [
          "request_id",
          "kind",
          "state",
          "answer",
          "error"
        ],
        "title": "LearningRequestReadSchema",
        "type": "object"
      },
      "LearningRequestState": {
        "description": "Where a learning request given in the background stands.",
        "enum": [
          "running",
          "done",
          "failed"
        ],
        "title": "LearningRequestState",
        "type": "string"
      },
      "LearningSource": {
        "description": "Where a learning came from: the surface a thumbs down was given on, or a release pass.\n\nAlso the ``surface`` of the event that wrote it.",
        "enum": [
          "table_cells",
          "agent_preview",
          "task",
          "writing_preview",
          "reply_draft",
          "sent_message",
          "hand_edit",
          "simplified",
          "carried",
          "template",
          "hand"
        ],
        "title": "LearningSource",
        "type": "string"
      },
      "LearningVersionAction": {
        "description": "What one write did to a learning, as its version history keeps it.",
        "enum": [
          "added",
          "rewritten",
          "moved",
          "deleted",
          "restored"
        ],
        "title": "LearningVersionAction",
        "type": "string"
      },
      "LearningVersionReadSchema": {
        "description": "One version of a learning: how it read after one write.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/LearningVersionAction",
            "description": "`added`, `rewritten`, `moved` (between one sequence and all sequences), `deleted` (its last words) or `restored`."
          },
          "all_sequences": {
            "description": "Whether every sequence's writer followed it then.",
            "title": "All Sequences",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "event_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The feedback session that made the write (`GET /agent-learnings/thumbs-downs/{event_id}/`); null for a hand edit or a release.",
            "title": "Event Id"
          },
          "id": {
            "description": "The version: restore it to roll the learning back to it.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "learning_id": {
            "format": "uuid",
            "title": "Learning Id",
            "type": "string"
          },
          "step_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The one step it held for; null for every message.",
            "title": "Step Key"
          },
          "text": {
            "description": "The learning as the write left it.",
            "title": "Text",
            "type": "string"
          },
          "user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who made the write; null for a release.",
            "title": "User Id"
          }
        },
        "required": [
          "id",
          "learning_id",
          "action",
          "text",
          "step_key",
          "all_sequences",
          "event_id",
          "user_id",
          "created_at"
        ],
        "title": "LearningVersionReadSchema",
        "type": "object"
      },
      "LikeLatestPostOutcome": {
        "additionalProperties": false,
        "description": "What liking the latest post produced: the common fields and the nine profile facts.\n\nA member with no posts is skipped, not failed.",
        "properties": {
          "already_connected": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Connected"
          },
          "already_following": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Following"
          },
          "can_send_message": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Can Send Message"
          },
          "found_already": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInFoundAlready"
              },
              {
                "type": "null"
              }
            ]
          },
          "invitation_pending": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invitation Pending"
          },
          "kind": {
            "const": "like_latest_post",
            "default": "like_latest_post",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "member_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 8,
            "title": "Member Urns",
            "type": "array"
          },
          "open_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open Profile"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "profile_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Resolved"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "vanity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity"
          }
        },
        "title": "LikeLatestPostOutcome",
        "type": "object"
      },
      "LikeLatestPostParams": {
        "additionalProperties": false,
        "description": "Like whatever the member posted most recently, if anything. Starts at ``profile_url``.",
        "properties": {
          "kind": {
            "const": "like_latest_post",
            "default": "like_latest_post",
            "title": "Kind",
            "type": "string"
          },
          "profile_url": {
            "maxLength": 512,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "profile_url"
        ],
        "title": "LikeLatestPostParams",
        "type": "object"
      },
      "LinkReaderFieldReadSchema": {
        "description": "One value a link of another table brings back from this table.",
        "properties": {
          "column_id": {
            "description": "This table's column the value is read from.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "name": {
            "description": "The value's name on the link.",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "column_id",
          "name"
        ],
        "title": "LinkReaderFieldReadSchema",
        "type": "object"
      },
      "LinkReaderReadSchema": {
        "description": "A link of another table into this one, and which of this table's columns it reads.",
        "properties": {
          "brought_back": {
            "description": "The values the link brings back from this table, each its own column there.",
            "items": {
              "$ref": "#/components/schemas/LinkReaderFieldReadSchema"
            },
            "title": "Brought Back",
            "type": "array"
          },
          "column_id": {
            "description": "The link column, on that table.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "title": "Column Name",
            "type": "string"
          },
          "matched_on_column_ids": {
            "description": "This table's columns the link matches on.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Matched On Column Ids",
            "type": "array"
          },
          "table_id": {
            "description": "The table the link is on.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "column_id",
          "column_name",
          "matched_on_column_ids",
          "brought_back"
        ],
        "title": "LinkReaderReadSchema",
        "type": "object"
      },
      "LinkedInAccountReadSchema": {
        "properties": {
          "approvals_waiting": {
            "default": 0,
            "description": "How many of this sender's LinkedIn steps wait for a person on Tasks, less those a paused sequence or paused contact holds.",
            "title": "Approvals Waiting",
            "type": "integer"
          },
          "checkpoint_status": {
            "$ref": "#/components/schemas/LinkedInCheckpointStatus"
          },
          "connection_checks": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInConnectionChecksReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the readings of the sender's newest connections, which notice accepted connection requests, are doing. Older servers leave it out."
          },
          "connection_token": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a person pastes into the extension to connect a browser. Several browsers may use it; Regenerate and Disconnect replace it. Given to a signed-in person only: null for an API key.",
            "title": "Connection Token"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "daily_limit_check_connections": {
            "description": "Readings of the sender's newest connections a day: how accepted connection requests are noticed. Zero stops them.",
            "title": "Daily Limit Check Connections",
            "type": "integer"
          },
          "daily_limit_check_inbox": {
            "title": "Daily Limit Check Inbox",
            "type": "integer"
          },
          "daily_limit_check_sent_invitations": {
            "title": "Daily Limit Check Sent Invitations",
            "type": "integer"
          },
          "daily_limit_company_employees_view": {
            "description": "Company People tab searches a day, asked for by table columns.",
            "title": "Daily Limit Company Employees View",
            "type": "integer"
          },
          "daily_limit_company_profile_view": {
            "description": "Company page views a day, asked for by table columns.",
            "title": "Daily Limit Company Profile View",
            "type": "integer"
          },
          "daily_limit_connection_request": {
            "title": "Daily Limit Connection Request",
            "type": "integer"
          },
          "daily_limit_follow": {
            "title": "Daily Limit Follow",
            "type": "integer"
          },
          "daily_limit_like_post": {
            "title": "Daily Limit Like Post",
            "type": "integer"
          },
          "daily_limit_profile_view": {
            "title": "Daily Limit Profile View",
            "type": "integer"
          },
          "daily_limit_read_conversation": {
            "title": "Daily Limit Read Conversation",
            "type": "integer"
          },
          "daily_limit_send_message": {
            "description": "Messages and InMails a day, counted together.",
            "title": "Daily Limit Send Message",
            "type": "integer"
          },
          "daily_limit_withdraw": {
            "title": "Daily Limit Withdraw",
            "type": "integer"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "effective_run_mode": {
            "$ref": "#/components/schemas/LinkedInApprovalMode",
            "description": "The approval setting in force for this sender's LinkedIn steps: their own, else manual. What the extension's side panel shows."
          },
          "headline": {
            "title": "Headline",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_seen_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Seen At"
          },
          "limit_maximums": {
            "$ref": "#/components/schemas/LinkedInLimitMaximumsReadSchema",
            "description": "The most each limit above may be set to, under the same field names the settings update takes. A value above one is refused with a 422."
          },
          "member_urn": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "min_action_interval_seconds": {
            "description": "The least time between two steps on this LinkedIn account, in seconds, before a random widening of up to 40% is added. It holds across every sequence the account sends for.",
            "title": "Min Action Interval Seconds",
            "type": "integer"
          },
          "online": {
            "title": "Online",
            "type": "boolean"
          },
          "photo_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Photo Url"
          },
          "presence": {
            "$ref": "#/components/schemas/LinkedInPresence",
            "description": "active: a browser checked in within the last couple of minutes. idle: seen within the last day. not_seen: no browser has checked in for a day."
          },
          "queued_count": {
            "default": 0,
            "title": "Queued Count",
            "type": "integer"
          },
          "replies_check": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInRepliesCheckReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the sender's inbox is being read for the messages that wait on it. Older servers leave it out."
          },
          "run_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInApprovalMode"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender's own LinkedIn approval setting: manual (a person approves each step on Tasks before it is queued) or auto (steps are queued without asking). Null when it was never set, which runs as manual."
          },
          "sender_profile_id": {
            "format": "uuid",
            "title": "Sender Profile Id",
            "type": "string"
          },
          "sessions": {
            "description": "Every browser currently connected, most recent first.",
            "items": {
              "$ref": "#/components/schemas/LinkedInAgentSessionReadSchema"
            },
            "title": "Sessions",
            "type": "array"
          },
          "status": {
            "$ref": "#/components/schemas/LinkedInAccountStatus"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "usage": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/LinkedInKindUsageReadSchema"
            },
            "title": "Usage",
            "type": "array"
          },
          "usage_resets_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When today's counts in usage start over: 00:00 in the sender's timezone. Older servers leave it out, and a client then reads the next UTC midnight.",
            "title": "Usage Resets At"
          },
          "vanity_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity Name"
          },
          "wait": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInWaitReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the next step is waiting on, and until when; null while nothing is queued."
          },
          "weekly_connection_request_cap": {
            "title": "Weekly Connection Request Cap",
            "type": "integer"
          },
          "weekly_limit_check_connections": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Check Connections"
          },
          "weekly_limit_check_inbox": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Check Inbox"
          },
          "weekly_limit_check_sent_invitations": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Check Sent Invitations"
          },
          "weekly_limit_company_employees_view": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Company Employees View"
          },
          "weekly_limit_company_profile_view": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Company Profile View"
          },
          "weekly_limit_follow": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Follow"
          },
          "weekly_limit_like_post": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Like Post"
          },
          "weekly_limit_profile_view": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Profile View"
          },
          "weekly_limit_read_conversation": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Read Conversation"
          },
          "weekly_limit_send_message": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Send Message"
          },
          "weekly_limit_withdraw": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Withdraw"
          }
        },
        "required": [
          "id",
          "sender_profile_id",
          "status",
          "checkpoint_status",
          "member_urn",
          "vanity_name",
          "display_name",
          "headline",
          "photo_url",
          "run_mode",
          "effective_run_mode",
          "online",
          "presence",
          "last_seen_at",
          "daily_limit_profile_view",
          "daily_limit_connection_request",
          "daily_limit_send_message",
          "daily_limit_withdraw",
          "daily_limit_follow",
          "daily_limit_like_post",
          "daily_limit_check_sent_invitations",
          "daily_limit_check_inbox",
          "daily_limit_read_conversation",
          "daily_limit_check_connections",
          "weekly_connection_request_cap",
          "daily_limit_company_profile_view",
          "daily_limit_company_employees_view",
          "min_action_interval_seconds",
          "limit_maximums",
          "created_at",
          "updated_at"
        ],
        "title": "LinkedInAccountReadSchema",
        "type": "object"
      },
      "LinkedInAccountStateSchema": {
        "description": "The sender's LinkedIn state, connected or not.\n\nA wrapper rather than a 404 on purpose: \"no account yet\" is the normal first\nrender of this page, not an error. For a signed-in person the connection\ntoken is present in BOTH states: shown by default before anything is\nconnected, and available again afterwards for a second browser. An API key\nnever gets it.",
        "properties": {
          "account": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInAccountReadSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "connected": {
            "title": "Connected",
            "type": "boolean"
          },
          "connection_token": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Paste this into the Oneprofile extension to connect a browser as this sender. Given to a signed-in person only: null for an API key.",
            "title": "Connection Token"
          }
        },
        "required": [
          "connected",
          "account",
          "connection_token"
        ],
        "title": "LinkedInAccountStateSchema",
        "type": "object"
      },
      "LinkedInAccountStatus": {
        "description": "Pairing lifecycle.\n\n``PENDING`` exists between \"the user asked to connect\" and \"an extension\nactually bound a LinkedIn member to it\", so the sender page can show a\nhalf-finished connection rather than nothing at all.",
        "enum": [
          "pending",
          "active",
          "revoked"
        ],
        "title": "LinkedInAccountStatus",
        "type": "string"
      },
      "LinkedInActionCountSchema": {
        "properties": {
          "count": {
            "description": "How many of the sender's LinkedIn steps match the filters.",
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "LinkedInActionCountSchema",
        "type": "object"
      },
      "LinkedInActionKind": {
        "description": "What the browser agent is being asked to do.\n\nThe four ``CHECK_*``/``READ_*`` kinds are housekeeping: they read our own\noutbound invitations, our own newest connections and our own conversations to\ndetect what the contact did, so they are free and deliberately excluded from\nthe priced kinds below.\n\n``CHECK_CONNECTIONS`` reads the first batch of the sender's connections list,\nnewest first: a person found there has accepted, whenever the invitation\nwent out. It is how an acceptance is noticed at all once an invitation has\nfallen out of the ten rows the sent list shows a background tab.\n\n``CHECK_INBOX`` scans the conversation list for threads with new inbound\nactivity; ``READ_CONVERSATION`` opens one of them and reads it in full. The\nsplit keeps LinkedIn activity proportional to real replies: the cheap scan\nruns on every sweep, the expensive read only where the scan saw a change.\n\n``LIKE_LATEST_POST`` targets the contact's most recent post at the moment\nthe browser runs it. A contact with no posts is not a failure: the driver\nreports the action ``SKIPPED``, and the sequence advances either way.\n\nEvery profile-targeted outcome carries the facts the browser read off the\nprofile, including the three-state Premium \"Open Profile\" reading; see the\nsection comment above the outcome models.\n\n``COMPANY_PROFILE_VIEW`` opens a company's LinkedIn page and reads its\nfacts; ``COMPANY_EMPLOYEES_VIEW`` opens the page's People tab, searches it\nfor a few role keywords and reads the people it lists. Both are a person\nbrowsing, so they keep the outreach pace and limits, and both are asked\nfor by a table column, never by a sequence. Neither touches a member, so\nneither is profile-targeted.",
        "enum": [
          "profile_view",
          "connection_request",
          "send_message",
          "inmail",
          "withdraw_connection_request",
          "follow_contact",
          "like_latest_post",
          "check_sent_invitations",
          "check_connections",
          "check_inbox",
          "read_conversation",
          "company_profile_view",
          "company_employees_view"
        ],
        "title": "LinkedInActionKind",
        "type": "string"
      },
      "LinkedInActionOutcome-Input": {
        "description": "What one action reported back. Consumers read the member via ``.root``.\n\nNull on the row while the action is queued or claimed, and on a row the\nbackend settled unrun by rejection or cancellation; a document of the\nmatching member once a browser ran it or expiry settled it.",
        "discriminator": {
          "mapping": {
            "check_connections": "#/components/schemas/CheckConnectionsOutcome",
            "check_inbox": "#/components/schemas/CheckInboxOutcome",
            "check_sent_invitations": "#/components/schemas/CheckSentInvitationsOutcome",
            "company_employees_view": "#/components/schemas/CompanyEmployeesViewOutcome",
            "company_profile_view": "#/components/schemas/CompanyProfileViewOutcome",
            "connection_request": "#/components/schemas/ConnectionRequestOutcome",
            "follow_contact": "#/components/schemas/FollowContactOutcome",
            "inmail": "#/components/schemas/InMailOutcome",
            "like_latest_post": "#/components/schemas/LikeLatestPostOutcome",
            "profile_view": "#/components/schemas/ProfileViewOutcome-Input",
            "read_conversation": "#/components/schemas/ReadConversationOutcome",
            "send_message": "#/components/schemas/SendMessageOutcome",
            "withdraw_connection_request": "#/components/schemas/WithdrawConnectionRequestOutcome"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ProfileViewOutcome-Input"
          },
          {
            "$ref": "#/components/schemas/ConnectionRequestOutcome"
          },
          {
            "$ref": "#/components/schemas/SendMessageOutcome"
          },
          {
            "$ref": "#/components/schemas/InMailOutcome"
          },
          {
            "$ref": "#/components/schemas/WithdrawConnectionRequestOutcome"
          },
          {
            "$ref": "#/components/schemas/FollowContactOutcome"
          },
          {
            "$ref": "#/components/schemas/LikeLatestPostOutcome"
          },
          {
            "$ref": "#/components/schemas/CheckSentInvitationsOutcome"
          },
          {
            "$ref": "#/components/schemas/CheckConnectionsOutcome"
          },
          {
            "$ref": "#/components/schemas/CheckInboxOutcome"
          },
          {
            "$ref": "#/components/schemas/ReadConversationOutcome"
          },
          {
            "$ref": "#/components/schemas/CompanyProfileViewOutcome"
          },
          {
            "$ref": "#/components/schemas/CompanyEmployeesViewOutcome"
          }
        ],
        "title": "LinkedInActionOutcome"
      },
      "LinkedInActionOutcome-Output": {
        "description": "What one action reported back. Consumers read the member via ``.root``.\n\nNull on the row while the action is queued or claimed, and on a row the\nbackend settled unrun by rejection or cancellation; a document of the\nmatching member once a browser ran it or expiry settled it.",
        "discriminator": {
          "mapping": {
            "check_connections": "#/components/schemas/CheckConnectionsOutcome",
            "check_inbox": "#/components/schemas/CheckInboxOutcome",
            "check_sent_invitations": "#/components/schemas/CheckSentInvitationsOutcome",
            "company_employees_view": "#/components/schemas/CompanyEmployeesViewOutcome",
            "company_profile_view": "#/components/schemas/CompanyProfileViewOutcome",
            "connection_request": "#/components/schemas/ConnectionRequestOutcome",
            "follow_contact": "#/components/schemas/FollowContactOutcome",
            "inmail": "#/components/schemas/InMailOutcome",
            "like_latest_post": "#/components/schemas/LikeLatestPostOutcome",
            "profile_view": "#/components/schemas/ProfileViewOutcome-Output",
            "read_conversation": "#/components/schemas/ReadConversationOutcome",
            "send_message": "#/components/schemas/SendMessageOutcome",
            "withdraw_connection_request": "#/components/schemas/WithdrawConnectionRequestOutcome"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ProfileViewOutcome-Output"
          },
          {
            "$ref": "#/components/schemas/ConnectionRequestOutcome"
          },
          {
            "$ref": "#/components/schemas/SendMessageOutcome"
          },
          {
            "$ref": "#/components/schemas/InMailOutcome"
          },
          {
            "$ref": "#/components/schemas/WithdrawConnectionRequestOutcome"
          },
          {
            "$ref": "#/components/schemas/FollowContactOutcome"
          },
          {
            "$ref": "#/components/schemas/LikeLatestPostOutcome"
          },
          {
            "$ref": "#/components/schemas/CheckSentInvitationsOutcome"
          },
          {
            "$ref": "#/components/schemas/CheckConnectionsOutcome"
          },
          {
            "$ref": "#/components/schemas/CheckInboxOutcome"
          },
          {
            "$ref": "#/components/schemas/ReadConversationOutcome"
          },
          {
            "$ref": "#/components/schemas/CompanyProfileViewOutcome"
          },
          {
            "$ref": "#/components/schemas/CompanyEmployeesViewOutcome"
          }
        ],
        "title": "LinkedInActionOutcome"
      },
      "LinkedInActionParams": {
        "description": "What one action is asked to do. Consumers read the member via ``.root``.",
        "discriminator": {
          "mapping": {
            "check_connections": "#/components/schemas/CheckConnectionsParams",
            "check_inbox": "#/components/schemas/CheckInboxParams",
            "check_sent_invitations": "#/components/schemas/CheckSentInvitationsParams",
            "company_employees_view": "#/components/schemas/CompanyEmployeesViewParams",
            "company_profile_view": "#/components/schemas/CompanyProfileViewParams",
            "connection_request": "#/components/schemas/ConnectionRequestParams",
            "follow_contact": "#/components/schemas/FollowContactParams",
            "inmail": "#/components/schemas/InMailParams",
            "like_latest_post": "#/components/schemas/LikeLatestPostParams",
            "profile_view": "#/components/schemas/ProfileViewParams",
            "read_conversation": "#/components/schemas/ReadConversationParams",
            "send_message": "#/components/schemas/SendMessageParams",
            "withdraw_connection_request": "#/components/schemas/WithdrawConnectionRequestParams"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ProfileViewParams"
          },
          {
            "$ref": "#/components/schemas/ConnectionRequestParams"
          },
          {
            "$ref": "#/components/schemas/SendMessageParams"
          },
          {
            "$ref": "#/components/schemas/InMailParams"
          },
          {
            "$ref": "#/components/schemas/WithdrawConnectionRequestParams"
          },
          {
            "$ref": "#/components/schemas/FollowContactParams"
          },
          {
            "$ref": "#/components/schemas/LikeLatestPostParams"
          },
          {
            "$ref": "#/components/schemas/CheckSentInvitationsParams"
          },
          {
            "$ref": "#/components/schemas/CheckConnectionsParams"
          },
          {
            "$ref": "#/components/schemas/CheckInboxParams"
          },
          {
            "$ref": "#/components/schemas/ReadConversationParams"
          },
          {
            "$ref": "#/components/schemas/CompanyProfileViewParams"
          },
          {
            "$ref": "#/components/schemas/CompanyEmployeesViewParams"
          }
        ],
        "title": "LinkedInActionParams"
      },
      "LinkedInActionPhase": {
        "description": "Where a step stands in its life; how it ended is its request's ``outcome``.\n\n``QUEUED`` waits in its sender's line. ``RESUMING`` was put back after an\nattempt that may have acted on LinkedIn, and goes only to a browser that\nlooks first. ``CLAIMED`` is in a browser now. ``SETTLED`` is over, and its\nrequest carries the outcome.",
        "enum": [
          "queued",
          "resuming",
          "claimed",
          "settled"
        ],
        "title": "LinkedInActionPhase",
        "type": "string"
      },
      "LinkedInActionReadSchema": {
        "description": "One LinkedIn step, in the shape the dashboard and every extension build read.\n\nA step is queued only once it may run (its approval, when one was asked\nfor, happened on Tasks before it was queued), so every step reads\n``approved_at`` as the moment it was queued and ``requires_approval``\nfalse: the extension's store builds draw \"Approve tasks\" from exactly\nthese two fields, and no step in the line waits for a person. ``hold`` is\nkept for the same builds and is always null: whether a step is out of the\nline is ``held``.",
        "properties": {
          "account_id": {
            "format": "uuid",
            "title": "Account Id",
            "type": "string"
          },
          "acted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the step said it acted on LinkedIn, for a result that arrived late. On a failed step it means the step happened after all: it stays failed for a person, and a Retry checks LinkedIn first and never sends it twice.",
            "title": "Acted At"
          },
          "approved_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the step was let run: the moment it was queued, since a step is queued only once it may run. Kept for older extension builds.",
            "title": "Approved At"
          },
          "claimed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Claimed At"
          },
          "contact_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who the step is for, as their audience row names them, on the sender's list of steps. Null when no audience row names them (a step tried by hand, a staff step, one of our own reads, a table with no name column): the profile address in `params` is then all there is.",
            "title": "Contact Name"
          },
          "duration_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Duration Ms"
          },
          "error_code": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInAgentErrorCode"
              },
              {
                "type": "null"
              }
            ]
          },
          "error_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Message"
          },
          "finished_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Finished At"
          },
          "held": {
            "default": false,
            "description": "Whether the step is held out of every browser's line, because its paused sequence or paused contact holds it. It runs once they are resumed. Only the dashboard's queue lists a held step that is waiting; a browser is never sent one.",
            "title": "Held",
            "type": "boolean"
          },
          "hold": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StepHold"
              },
              {
                "type": "null"
              }
            ],
            "description": "Always null; read `held`. Kept for older extension builds."
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/LinkedInActionKind"
          },
          "metered": {
            "default": true,
            "description": "Whether the step spends the sender's limits and credit. False for a step the Oneprofile team fired to test the sender: it goes first, waits for no gap and counts against no limit.",
            "title": "Metered",
            "type": "boolean"
          },
          "outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInActionOutcome-Output"
              },
              {
                "type": "null"
              }
            ]
          },
          "paced": {
            "default": true,
            "description": "Whether the step waits the sender's Time between steps. False for a step queued to run fast, such as a fast Map on LinkedIn's company page and People search: it runs a minute or two after the last step, in the gaps between the steps that reach a person, and still spends the sender's limits and credit.",
            "title": "Paced",
            "type": "boolean"
          },
          "params": {
            "$ref": "#/components/schemas/LinkedInActionParams"
          },
          "queued_at": {
            "format": "date-time",
            "title": "Queued At",
            "type": "string"
          },
          "requires_approval": {
            "default": false,
            "description": "Always false: a step that asks for a person waits on Oneprofile's Tasks page, never in the line. Kept for older extension builds.",
            "title": "Requires Approval",
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/LinkedInActionStatus"
          },
          "table": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInStepTableSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table whose enrichment column queued the step (View a LinkedIn profile, Research company graph on LinkedIn), on the sender's list of steps. Null for a sequence's step and every other."
          }
        },
        "required": [
          "id",
          "account_id",
          "kind",
          "params",
          "status",
          "outcome",
          "error_code",
          "error_message",
          "queued_at",
          "claimed_at",
          "finished_at",
          "duration_ms"
        ],
        "title": "LinkedInActionReadSchema",
        "type": "object"
      },
      "LinkedInActionStatus": {
        "description": "Where one queued action stands.\n\nGovernor-deferral is deliberately NOT a status: an action whose kind has hit\nits daily cap stays ``QUEUED`` and is simply not handed out, with the reason\ntravelling on the hand-out response instead. A ``DEFERRED`` row would make\nthe queue lie about what is still waiting to happen.\n\n``SKIPPED`` is \"not applicable\" (no LinkedIn URL, already connected);\n``REJECTED`` is \"a human refused it\"; ``FAILED`` is \"we tried and could not\".\n\n``RESUMING`` is a step put back in line after an attempt that may have\nacted on LinkedIn (its browser was granted the press, or lost track of the\nstep): it is never \"queued\", so no path that assumes nothing happened yet\n(moving it to another sender, a plain copy, \"did not run\") ever reads it as\nsuch, and it is handed only to a browser that checks LinkedIn before acting.",
        "enum": [
          "queued",
          "resuming",
          "claimed",
          "succeeded",
          "failed",
          "rejected",
          "skipped"
        ],
        "title": "LinkedInActionStatus",
        "type": "string"
      },
      "LinkedInAgentErrorCode": {
        "description": "Why one action did not succeed, as a closed vocabulary.\n\nTwo populations in one enum, on purpose. The first twelve are reported by\nthe browser agent and were previously a free string that only the extension\nhad written down, so nothing stopped a typo storing and rendering exactly like\na real code. The last four the backend writes itself: three when an action\nsettles without the browser ever running it, and ``CLAIM_EXPIRED`` when the\nbrowser took a step and then went silent, so nobody can say whether it ran.\n\nThe list is the whole contract: a code outside it is rejected at the API\nboundary rather than persisted, so the extension and the dashboard can only\never speak about failures both sides can name.",
        "enum": [
          "selector_missing",
          "blocked_checkpoint",
          "not_authenticated",
          "account_mismatch",
          "navigation_failed",
          "timed_out",
          "linkedin_error",
          "agent_restarted",
          "tab_lost",
          "not_applicable",
          "not_connected",
          "invalid_params",
          "user_rejected",
          "cancelled",
          "missed_window",
          "sender_changed",
          "claim_expired",
          "interrupted_repeatedly"
        ],
        "title": "LinkedInAgentErrorCode",
        "type": "string"
      },
      "LinkedInAgentReportableStatus": {
        "description": "The subset of ``LinkedInActionStatus`` a browser agent is allowed to post.\n\n``QUEUED`` and ``CLAIMED`` are the server's to write, and ``REJECTED``\narrives on its own endpoint because it costs neither budget nor credit.\nPosting it as a result would settle the action down the wrong path. The\nresult endpoint accepted the full enum before this existed, so an agent\ncould post ``claimed`` and have it written with a ``finished_at``.",
        "enum": [
          "succeeded",
          "failed",
          "skipped"
        ],
        "title": "LinkedInAgentReportableStatus",
        "type": "string"
      },
      "LinkedInAgentSessionReadSchema": {
        "description": "One browser connected to the account: a laptop, a desktop, a teammate's machine.",
        "properties": {
          "browser_label": {
            "title": "Browser Label",
            "type": "string"
          },
          "connected_at": {
            "format": "date-time",
            "title": "Connected At",
            "type": "string"
          },
          "extension_version": {
            "title": "Extension Version",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_seen_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Seen At"
          },
          "presence": {
            "$ref": "#/components/schemas/LinkedInPresence"
          }
        },
        "required": [
          "id",
          "browser_label",
          "extension_version",
          "presence",
          "last_seen_at",
          "connected_at"
        ],
        "title": "LinkedInAgentSessionReadSchema",
        "type": "object"
      },
      "LinkedInApprovalMode": {
        "description": "Whether a person approves a sender's LinkedIn steps before they run, or they run on their own.\n\nThe sender's own LinkedIn setting, kept on the sender beside their email\nmodes so the approval queue reads one home for both. The absence of one\n(``SenderProfileDTO.linkedin_approval_mode`` is None) reads as MANUAL:\nnothing runs on somebody's LinkedIn unattended until they have said so. The\napproval queue still tells \"never set\" apart from \"chose manual\", which is\nthe level its settings surfaces name.",
        "enum": [
          "manual",
          "auto"
        ],
        "title": "LinkedInApprovalMode",
        "type": "string"
      },
      "LinkedInApprovalScheduleReadSchema": {
        "description": "When one sender's share of the steps just approved is expected to run.",
        "properties": {
          "account_id": {
            "format": "uuid",
            "title": "Account Id",
            "type": "string"
          },
          "after_reset": {
            "description": "How many wait for that reset or later.",
            "title": "After Reset",
            "type": "integer"
          },
          "before_reset": {
            "description": "How many are expected to start before the next daily reset (midnight in the sender's timezone).",
            "title": "Before Reset",
            "type": "integer"
          },
          "blocked": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInScheduleBlock"
              },
              {
                "type": "null"
              }
            ],
            "description": "What stops them outright: `browser_offline` no browser is checked in for the sender, `account_blocked` the account is disconnected or at a checkpoint, `weekly_limit` the weekly connection request cap is spent, `kind_disabled` a limit is set to 0. `outside_window` is not a stop: some of them wait for their sequence's sending hours, in the sender's timezone, which open at `opens_at`. Null when nothing does."
          },
          "count": {
            "description": "How many of the approved steps are this sender's.",
            "title": "Count",
            "type": "integer"
          },
          "first_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the first of them starts; null when no time can be named.",
            "title": "First At"
          },
          "held": {
            "default": 0,
            "description": "How many of them wait for their paused sequence or paused contact to be resumed. They are in no line until then, and the counts and times above leave them out.",
            "title": "Held",
            "type": "integer"
          },
          "last_at_estimate": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the last of them is expected to start; null when it cannot be named.",
            "title": "Last At Estimate"
          },
          "opens_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the sending hours the first of them waits for open; null when none wait for them.",
            "title": "Opens At"
          },
          "outside_window": {
            "default": 0,
            "description": "How many of them wait for their sequence's sending hours, shut now in the sender's timezone.",
            "title": "Outside Window",
            "type": "integer"
          },
          "resets_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The daily reset those wait for; null when none do.",
            "title": "Resets At"
          },
          "sender_name": {
            "description": "The sender as the Senders page names them.",
            "title": "Sender Name",
            "type": "string"
          },
          "sender_profile_id": {
            "format": "uuid",
            "title": "Sender Profile Id",
            "type": "string"
          }
        },
        "required": [
          "account_id",
          "sender_profile_id",
          "sender_name",
          "count",
          "first_at",
          "last_at_estimate",
          "before_reset",
          "after_reset",
          "resets_at",
          "blocked"
        ],
        "title": "LinkedInApprovalScheduleReadSchema",
        "type": "object"
      },
      "LinkedInAttemptVerdict": {
        "description": "The server's answer to a browser that lost a run of a step and wants to start it again.\n\n``RETRY``: start it again. ``LOOK_FIRST``: start it again, looking on\nLinkedIn before pressing anything, because an earlier run was let press.\n``STOP``: the step was interrupted too often and the server settled it\nfailed. ``LOST``: the claim is no longer this browser's. ``NOT_RETRYABLE``:\nwhat stopped it is not an interruption, or a press LinkedIn never answered\nor a page that never drew reached the cap; post the result instead.",
        "enum": [
          "retry",
          "look_first",
          "stop",
          "lost",
          "not_retryable"
        ],
        "title": "LinkedInAttemptVerdict",
        "type": "string"
      },
      "LinkedInBrowserSettings": {
        "description": "Settings for an enrichment run through a sender's own LinkedIn browser.\n\nThe row's LinkedIn address is not here: it arrives per row as the resolved\nprompt, a single reference to the bound column, the way a record lookup's\nidentity value does. What a column fixes is whose browser does the work\n(``sender_profile_id``): an ID, because two senders may share a name.\nA plain identifier on purpose: this module sits in the table stratum, which\nmay not import the outreach senders, so the executor (which lives above\nboth) resolves the sender and its LinkedIn connection at run time. None\nkeeps a half-configured draft saveable; the executor fails such a cell\nwith what to do rather than guessing a sender.",
        "properties": {
          "kind": {
            "const": "linkedin_browser",
            "default": "linkedin_browser",
            "title": "Kind",
            "type": "string"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender whose LinkedIn browser reads the profiles.",
            "title": "Sender Profile Id"
          }
        },
        "title": "LinkedInBrowserSettings",
        "type": "object"
      },
      "LinkedInCheckpointStatus": {
        "description": "Whether LinkedIn is currently challenging this account.",
        "enum": [
          "ok",
          "checkpoint"
        ],
        "title": "LinkedInCheckpointStatus",
        "type": "string"
      },
      "LinkedInCommitRefusal": {
        "description": "Why the server would not let a run press the control that changes LinkedIn.\n\n``lost``: the claim is no longer this browser's (settled, put back, or\nanother browser's). ``expired``: it has no lease (a lease that ran out on\na claim still this browser's is renewed by the grant). ``stale_run``: another\nrun of the same claim holds the grant. ``requeue_at_reset``: the step was\nheld into a new day whose limit is spent; it waits for the reset, put back\nto be looked at again, and never fails for it. ``wait_for_replies``: a\nmessage not pressed yet, while its sender's inbox goes unread or its\nrecipient's reply waits to be read; put back in line (2026-10-05).",
        "enum": [
          "lost",
          "expired",
          "stale_run",
          "requeue_at_reset",
          "wait_for_replies"
        ],
        "title": "LinkedInCommitRefusal",
        "type": "string"
      },
      "LinkedInCompanyContent": {
        "additionalProperties": false,
        "description": "What a company page view read off the company's LinkedIn page.\n\nThe facts LinkedIn draws on the page's top card and About tab, as written\nthere. ``employees_on_linkedin`` is the \"N employees\" link (members who\nlist it), which is not ``company_size``, the band the company chose\n(\"51-200 employees\"). ``followers`` reads \"12K followers\" as 12,000.",
        "properties": {
          "about": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "About"
          },
          "company_size": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Size"
          },
          "employees_on_linkedin": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Employees On Linkedin"
          },
          "followers": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Followers"
          },
          "founded": {
            "anyOf": [
              {
                "maximum": 9999.0,
                "minimum": 1000.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Founded"
          },
          "headquarters": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Headquarters"
          },
          "industry": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Industry"
          },
          "logo_url": {
            "anyOf": [
              {
                "maxLength": 1024,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Logo Url"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "specialties": {
            "items": {
              "maxLength": 300,
              "type": "string"
            },
            "maxItems": 40,
            "title": "Specialties",
            "type": "array"
          },
          "tagline": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tagline"
          },
          "website": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Website"
          }
        },
        "title": "LinkedInCompanyContent",
        "type": "object"
      },
      "LinkedInCompanyGraphSettings": {
        "description": "Settings for researching a company's buying committee in a sender's own LinkedIn.\n\nAs with ``LinkedInBrowserSettings``, the company's LinkedIn page arrives\nper row as the resolved prompt, and ``sender_profile_id`` names whose\nbrowser opens it. ``max_people`` caps how many people the People tab\nsearch reads, each charged as it is read. ``view_profiles`` also opens\neach committee member's profile from the people table the column fills\n(a LinkedIn profile view each).",
        "properties": {
          "kind": {
            "const": "linkedin_company_graph",
            "default": "linkedin_company_graph",
            "title": "Kind",
            "type": "string"
          },
          "max_people": {
            "default": 10,
            "description": "The most people one company's People tab search reads.",
            "maximum": 25.0,
            "minimum": 1.0,
            "title": "Max People",
            "type": "integer"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender whose LinkedIn browser opens the company pages.",
            "title": "Sender Profile Id"
          },
          "view_profiles": {
            "default": false,
            "description": "Also open each committee member's LinkedIn profile from the people table.",
            "title": "View Profiles",
            "type": "boolean"
          }
        },
        "title": "LinkedInCompanyGraphSettings",
        "type": "object"
      },
      "LinkedInCompanyPerson": {
        "additionalProperties": false,
        "description": "One person a People tab search listed: what their card shows.\n\n``profile_url`` is canonical (``https://www.linkedin.com/in/<slug>/``);\na card LinkedIn draws as \"LinkedIn Member\", with no name and no link, is\nnever read. ``degree`` is 1, 2 or 3 (3 for \"3rd+\"), None when the card\nshows none. ``keyword`` is the search that listed them first.",
        "properties": {
          "degree": {
            "anyOf": [
              {
                "maximum": 3.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Degree"
          },
          "full_name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Full Name",
            "type": "string"
          },
          "headline": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Headline"
          },
          "keyword": {
            "anyOf": [
              {
                "maxLength": 60,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Keyword"
          },
          "location": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Location"
          },
          "profile_url": {
            "maxLength": 512,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "profile_url",
          "full_name"
        ],
        "title": "LinkedInCompanyPerson",
        "type": "object"
      },
      "LinkedInConnectionChecksProblem": {
        "description": "The one problem with an account's connection checks a person can do something about.\n\nEach is named only while invitations are waiting for an answer.\n``EXTENSION_OUTDATED``: the browser driving the account runs a build that\ncannot read the connections list. ``CHECKS_FAILING``: readings keep failing,\nand ``last_checked_at`` names the last one that worked. ``TURNED_OFF``: the\nreadings' daily or weekly limit is set to zero. The first and the last are\nnamed only once the readings are announced (out of ``UNANNOUNCED_KINDS``):\nbefore an extension that runs them is released there is nothing to update\nto and no limit shown to raise. ``EXTENSION_OUTDATED`` also needs a browser\nconnected; with none, the account's sessions say why nothing runs.",
        "enum": [
          "extension_outdated",
          "checks_failing",
          "turned_off"
        ],
        "title": "LinkedInConnectionChecksProblem",
        "type": "string"
      },
      "LinkedInConnectionChecksReadSchema": {
        "description": "How the readings of the sender's newest connections are doing.\n\nThey are how an accepted connection request is noticed: a member found on\nthe list has accepted. The sender's tab shows only the problem states.",
        "properties": {
          "awaiting": {
            "description": "Connection requests a sequence is still waiting to hear an answer to.",
            "title": "Awaiting",
            "type": "integer"
          },
          "gaps": {
            "description": "The last week's stretches nobody watched, oldest first.",
            "items": {
              "$ref": "#/components/schemas/LinkedInConnectionsGapReadSchema"
            },
            "title": "Gaps",
            "type": "array"
          },
          "last_checked_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a reading last worked; null when none has yet.",
            "title": "Last Checked At"
          },
          "next_check_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the next reading is due; null when none will run (nothing awaited, the browser cannot run one, or its limit is zero).",
            "title": "Next Check At"
          },
          "problem": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInConnectionChecksProblem"
              },
              {
                "type": "null"
              }
            ],
            "description": "The one problem a person can act on, only while answers are awaited: extension_outdated (the browser's build cannot read the list), checks_failing (readings keep failing since last_checked_at), or turned_off (the readings' limit is zero). Null when nothing is wrong."
          },
          "supported": {
            "description": "Whether the browser driving the account runs a build that reads the list.",
            "title": "Supported",
            "type": "boolean"
          },
          "watched_since": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Since when every acceptance on this account would have been seen; null when no reading has worked yet.",
            "title": "Watched Since"
          }
        },
        "required": [
          "supported",
          "awaiting",
          "last_checked_at",
          "watched_since",
          "next_check_at",
          "problem",
          "gaps"
        ],
        "title": "LinkedInConnectionChecksReadSchema",
        "type": "object"
      },
      "LinkedInConnectionRow": {
        "additionalProperties": false,
        "description": "One row of a connections reading, newest first, as keys only.\n\n``keys`` spell the member the row names: its vanity, and any URN that was\ncross-checked against it, each hashed (see ``CONNECTION_ROW_KEY_PATTERN``).\nA row that named nobody the reading could trust has no keys, and keeps its\nplace, because where an unread row sits decides whether the reading proves\nthat nothing was missed.",
        "properties": {
          "keys": {
            "items": {
              "pattern": "^[0-9a-f]{32}$",
              "type": "string"
            },
            "maxItems": 4,
            "title": "Keys",
            "type": "array"
          }
        },
        "title": "LinkedInConnectionRow",
        "type": "object"
      },
      "LinkedInConnectionsGapReadSchema": {
        "description": "A stretch the readings of the sender's newest connections could not watch.",
        "properties": {
          "ended_at": {
            "description": "The reading that could not prove it missed nothing.",
            "format": "date-time",
            "title": "Ended At",
            "type": "string"
          },
          "problem": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInConnectionsReadProblem"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why: no_overlap (nothing shared with the reading before), short_overlap (fewer than two rows shared in order), reordered (a row of the reading before sat above the first shared one), or unread_rows (more unreadable rows above the overlap than before). Null for a value this server does not know."
          },
          "started_at": {
            "description": "The last reading that worked before it.",
            "format": "date-time",
            "title": "Started At",
            "type": "string"
          }
        },
        "required": [
          "started_at",
          "ended_at",
          "problem"
        ],
        "title": "LinkedInConnectionsGapReadSchema",
        "type": "object"
      },
      "LinkedInConnectionsReadProblem": {
        "description": "Why a connections reading was a gap or unjudged, as a closed vocabulary.\n\nThe gaps: nothing shared with the last judged reading (``NO_OVERLAP``,\nLinkedIn's empty list after one that listed rows included), fewer than two\nrows shared in order (``SHORT_OVERLAP``), a row of the last reading above\nthe first shared one (``REORDERED``), or more rows nobody could read above\nthe overlap than the last reading had (``UNREAD_ROWS``). The unjudged: the\nread failed or was skipped (``READ_FAILED``), its keys were salted for a\nmember other than the account's (``MEMBER_MISMATCH``), the list was not\nread in full (``INCOMPLETE``), its \"Recently added\" sort was not proven\n(``SORT_UNPROVEN``), or two snapshots disagreed (``UNSTABLE``).\n\nMembers are only ever added; a stored value this build does not know reads\nas None rather than failing the read.",
        "enum": [
          "no_overlap",
          "short_overlap",
          "reordered",
          "unread_rows",
          "read_failed",
          "member_mismatch",
          "incomplete",
          "sort_unproven",
          "unstable"
        ],
        "title": "LinkedInConnectionsReadProblem",
        "type": "string"
      },
      "LinkedInConversationRow": {
        "additionalProperties": false,
        "description": "One row of the message-list scan, as the agent read it off the page.",
        "properties": {
          "conversation_urn": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Conversation Urn"
          },
          "last_activity_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Activity At"
          },
          "last_inbound_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Inbound At"
          },
          "member_urn": {
            "maxLength": 128,
            "title": "Member Urn",
            "type": "string"
          },
          "snippet": {
            "default": "",
            "maxLength": 200,
            "title": "Snippet",
            "type": "string"
          }
        },
        "required": [
          "member_urn"
        ],
        "title": "LinkedInConversationRow",
        "type": "object"
      },
      "LinkedInDiagnosticTrigger": {
        "description": "Why a browser filed a page report, as a closed vocabulary.\n\nA report is filed where a driver decided something from what it could NOT\nfind, or found something it does not know, so the markup behind the\ndecision can be read later (by a person, a Claude session, or server-side\ninference) and the selectors improved:\n\n- ``CONTROL_MISSING``: a control or window the step needs was not found.\n- ``UNRECOGNIZED_SURFACE``: a window appeared that nothing explains.\n- ``UNCONFIRMED``: the step pressed its last button and could not verify\n  the result.\n- ``DRIVER_ERROR``: the driver threw.\n- ``NOT_OFFERED``: the step decided from an absence that LinkedIn does not\n  offer the control. Normal for most kinds (no posts to like, no Message\n  on a stranger), and the symptom of a selector that stopped matching when\n  it is not.\n- ``PAGE_UNSETTLED``: the page had not drawn its controls yet.\n- ``ACCOUNT_LIMIT``: LinkedIn is limiting this account, not us.\n- ``NO_RESPONSE``: a control was found and pressed, and nothing answered\n  it: no window, no menu, no change. Not ``CONTROL_MISSING``, which says\n  the control itself was not there; the two need different fixes.\n- ``STEP_FAILED``: the server filed the report itself, for a failed step\n  whose browser filed none of its own: a navigation that never landed, a\n  refusal toast, a lapsed claim, an identity check. Every failed step\n  gets a report, and this is the trigger when nothing more specific is\n  known.\n\nMembers are only ever added. A stored value this server does not know (a\nnewer build's, read after a rollback) reads as ``STEP_FAILED`` rather\nthan failing the read; see ``sql_repository._to_diagnostic_dto``.",
        "enum": [
          "control_missing",
          "unrecognized_surface",
          "unconfirmed",
          "driver_error",
          "not_offered",
          "page_unsettled",
          "account_limit",
          "no_response",
          "step_failed"
        ],
        "title": "LinkedInDiagnosticTrigger",
        "type": "string"
      },
      "LinkedInDisconnectResponseSchema": {
        "description": "What disconnecting a sender's LinkedIn account did, or would do on a dry run.",
        "properties": {
          "browsers_signed_out": {
            "description": "How many connected browsers are signed out; each learns of it at once.",
            "title": "Browsers Signed Out",
            "type": "integer"
          },
          "count": {
            "default": 1,
            "description": "The number of resources that were deleted.",
            "title": "Count",
            "type": "integer"
          },
          "detail": {
            "description": "The detail of why the resource was deleted.",
            "title": "Detail",
            "type": "string"
          },
          "queued_steps_kept": {
            "description": "How many steps are waiting in the line. They stay queued, so reconnecting carries on.",
            "title": "Queued Steps Kept",
            "type": "integer"
          }
        },
        "required": [
          "detail",
          "browsers_signed_out",
          "queued_steps_kept"
        ],
        "title": "LinkedInDisconnectResponseSchema",
        "type": "object"
      },
      "LinkedInFoundAlready": {
        "description": "Why a step that changes LinkedIn found its change already there, and settled succeeded.\n\nOnly for a step whose own earlier attempt may have made it: the server had\ngranted that attempt the press. A change already there with no grant ever\nwas made outside Oneprofile, and settles skipped (\"already pending\" and so\non), uncharged.",
        "enum": [
          "earlier_attempt"
        ],
        "title": "LinkedInFoundAlready",
        "type": "string"
      },
      "LinkedInHistoryPageSchema": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/LinkedInActionReadSchema"
            },
            "title": "Items",
            "type": "array"
          },
          "stats": {
            "$ref": "#/components/schemas/LinkedInStatsReadSchema"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "stats"
        ],
        "title": "LinkedInHistoryPageSchema",
        "type": "object"
      },
      "LinkedInKindUsageReadSchema": {
        "description": "One limit's spend, today and over the rolling week.\n\nOne entry per limit, so there is no ``inmail`` entry: InMails spend the\nmessage limit and are counted in the ``send_message`` entry.",
        "properties": {
          "daily_limit": {
            "title": "Daily Limit",
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/LinkedInActionKind"
          },
          "remaining_today": {
            "description": "What may still run today: the daily limit's headroom, held to the weekly limit's when that is nearer.",
            "title": "Remaining Today",
            "type": "integer"
          },
          "used_this_week": {
            "default": 0,
            "description": "Spent over today and the six days before it.",
            "title": "Used This Week",
            "type": "integer"
          },
          "used_today": {
            "title": "Used Today",
            "type": "integer"
          },
          "weekly_limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The ceiling over any seven days; null when there is none.",
            "title": "Weekly Limit"
          }
        },
        "required": [
          "kind",
          "used_today",
          "daily_limit",
          "remaining_today"
        ],
        "title": "LinkedInKindUsageReadSchema",
        "type": "object"
      },
      "LinkedInLimitMaximumsReadSchema": {
        "description": "The most each of an account's limits may be set to.\n\nKeyed by the settings update's own field names, so a form reads the\nmaximum for the field it is editing without a map of its own, and the\nnumbers are the ones the update validates against.",
        "properties": {
          "daily_limit_check_connections": {
            "title": "Daily Limit Check Connections",
            "type": "integer"
          },
          "daily_limit_check_inbox": {
            "title": "Daily Limit Check Inbox",
            "type": "integer"
          },
          "daily_limit_check_sent_invitations": {
            "title": "Daily Limit Check Sent Invitations",
            "type": "integer"
          },
          "daily_limit_company_employees_view": {
            "title": "Daily Limit Company Employees View",
            "type": "integer"
          },
          "daily_limit_company_profile_view": {
            "title": "Daily Limit Company Profile View",
            "type": "integer"
          },
          "daily_limit_connection_request": {
            "title": "Daily Limit Connection Request",
            "type": "integer"
          },
          "daily_limit_follow": {
            "title": "Daily Limit Follow",
            "type": "integer"
          },
          "daily_limit_like_post": {
            "title": "Daily Limit Like Post",
            "type": "integer"
          },
          "daily_limit_profile_view": {
            "title": "Daily Limit Profile View",
            "type": "integer"
          },
          "daily_limit_read_conversation": {
            "title": "Daily Limit Read Conversation",
            "type": "integer"
          },
          "daily_limit_send_message": {
            "title": "Daily Limit Send Message",
            "type": "integer"
          },
          "daily_limit_withdraw": {
            "title": "Daily Limit Withdraw",
            "type": "integer"
          },
          "weekly_connection_request_cap": {
            "title": "Weekly Connection Request Cap",
            "type": "integer"
          },
          "weekly_limit_check_connections": {
            "title": "Weekly Limit Check Connections",
            "type": "integer"
          },
          "weekly_limit_check_inbox": {
            "title": "Weekly Limit Check Inbox",
            "type": "integer"
          },
          "weekly_limit_check_sent_invitations": {
            "title": "Weekly Limit Check Sent Invitations",
            "type": "integer"
          },
          "weekly_limit_company_employees_view": {
            "title": "Weekly Limit Company Employees View",
            "type": "integer"
          },
          "weekly_limit_company_profile_view": {
            "title": "Weekly Limit Company Profile View",
            "type": "integer"
          },
          "weekly_limit_follow": {
            "title": "Weekly Limit Follow",
            "type": "integer"
          },
          "weekly_limit_like_post": {
            "title": "Weekly Limit Like Post",
            "type": "integer"
          },
          "weekly_limit_profile_view": {
            "title": "Weekly Limit Profile View",
            "type": "integer"
          },
          "weekly_limit_read_conversation": {
            "title": "Weekly Limit Read Conversation",
            "type": "integer"
          },
          "weekly_limit_send_message": {
            "title": "Weekly Limit Send Message",
            "type": "integer"
          },
          "weekly_limit_withdraw": {
            "title": "Weekly Limit Withdraw",
            "type": "integer"
          }
        },
        "required": [
          "daily_limit_profile_view",
          "daily_limit_connection_request",
          "daily_limit_send_message",
          "daily_limit_withdraw",
          "daily_limit_follow",
          "daily_limit_like_post",
          "daily_limit_check_sent_invitations",
          "daily_limit_check_inbox",
          "daily_limit_read_conversation",
          "daily_limit_check_connections",
          "weekly_connection_request_cap",
          "weekly_limit_profile_view",
          "weekly_limit_send_message",
          "weekly_limit_withdraw",
          "weekly_limit_follow",
          "weekly_limit_like_post",
          "weekly_limit_check_sent_invitations",
          "weekly_limit_check_inbox",
          "weekly_limit_read_conversation",
          "weekly_limit_check_connections",
          "daily_limit_company_profile_view",
          "daily_limit_company_employees_view",
          "weekly_limit_company_profile_view",
          "weekly_limit_company_employees_view"
        ],
        "title": "LinkedInLimitMaximumsReadSchema",
        "type": "object"
      },
      "LinkedInLookMode": {
        "description": "What a browser handed a step that may already have touched LinkedIn does first.\n\nBoth look on LinkedIn before anything else; a change already there is the\nstep done. ``verify_then_act`` then finishes a step found not done.\n``verify_only`` never presses: its sequence or contact was paused or\nstopped since it first ran, and a look only records the truth.",
        "enum": [
          "verify_then_act",
          "verify_only"
        ],
        "title": "LinkedInLookMode",
        "type": "string"
      },
      "LinkedInMessageRead": {
        "additionalProperties": false,
        "description": "One message read out of an opened conversation.",
        "properties": {
          "body_text": {
            "default": "",
            "maxLength": 8000,
            "title": "Body Text",
            "type": "string"
          },
          "is_inbound": {
            "title": "Is Inbound",
            "type": "boolean"
          },
          "message_urn": {
            "maxLength": 255,
            "title": "Message Urn",
            "type": "string"
          },
          "sender_member_urn": {
            "maxLength": 128,
            "title": "Sender Member Urn",
            "type": "string"
          },
          "sender_name": {
            "default": "",
            "maxLength": 255,
            "title": "Sender Name",
            "type": "string"
          },
          "sent_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sent At"
          }
        },
        "required": [
          "message_urn",
          "sender_member_urn",
          "is_inbound"
        ],
        "title": "LinkedInMessageRead",
        "type": "object"
      },
      "LinkedInPresence": {
        "description": "How recently ANY browser connected to this sender checked in.\n\nThree states, not two, because two different questions are asked of a\nconnection. ``ACTIVE`` answers \"can a step run right now\": a browser is\nopen and heartbeating. ``IDLE`` answers \"is this still set up\": the laptop\nwas closed for the evening. ``NOT_SEEN`` is the one that needs a person:\nnothing has checked in for a day, and queued work is silently waiting.",
        "enum": [
          "active",
          "idle",
          "not_seen"
        ],
        "title": "LinkedInPresence",
        "type": "string"
      },
      "LinkedInProfileContent": {
        "additionalProperties": false,
        "description": "What a profile view read off the member's profile, when its step asked (``read_profile``).\n\nEverything the profile enrichment's column can show that the page draws,\nunder the same names, so a read fills the same cell: the top card, About,\nExperience, Education, skills, languages, recent posts and articles. It\nrides on the result only: the step's row never keeps it (history and the\nTasks page show rows for a month), and it reaches the step's caller through\n``service.register_profile_read_hook``.\n\n``complete`` is False when the page held something back: LinkedIn hid\nroles or schools behind \"Show all\", or a section drew no entries.\n``connections`` reads LinkedIn's \"500+\" as 500.",
        "properties": {
          "about": {
            "anyOf": [
              {
                "maxLength": 2600,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "About"
          },
          "articles": {
            "items": {
              "$ref": "#/components/schemas/LinkedInProfilePost"
            },
            "maxItems": 10,
            "title": "Articles",
            "type": "array"
          },
          "background_url": {
            "anyOf": [
              {
                "maxLength": 1024,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Background Url"
          },
          "company_name": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Name"
          },
          "company_page": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Page"
          },
          "complete": {
            "default": false,
            "title": "Complete",
            "type": "boolean"
          },
          "connections": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Connections"
          },
          "country": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Country"
          },
          "education": {
            "items": {
              "$ref": "#/components/schemas/LinkedInProfileSchool"
            },
            "maxItems": 10,
            "title": "Education",
            "type": "array"
          },
          "first_name": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First Name"
          },
          "followers": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Followers"
          },
          "full_name": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Full Name"
          },
          "headline": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Headline"
          },
          "job_title": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Job Title"
          },
          "languages": {
            "items": {
              "maxLength": 300,
              "type": "string"
            },
            "maxItems": 60,
            "title": "Languages",
            "type": "array"
          },
          "last_name": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Name"
          },
          "location": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Location"
          },
          "photo": {
            "anyOf": [
              {
                "maxLength": 1024,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Photo"
          },
          "profile_url": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Url"
          },
          "recent_posts": {
            "items": {
              "$ref": "#/components/schemas/LinkedInProfilePost"
            },
            "maxItems": 10,
            "title": "Recent Posts",
            "type": "array"
          },
          "similar_profiles": {
            "items": {
              "maxLength": 512,
              "type": "string"
            },
            "maxItems": 20,
            "title": "Similar Profiles",
            "type": "array"
          },
          "skills": {
            "items": {
              "maxLength": 300,
              "type": "string"
            },
            "maxItems": 60,
            "title": "Skills",
            "type": "array"
          },
          "username": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Username"
          },
          "website_url": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Website Url"
          },
          "work_history": {
            "items": {
              "$ref": "#/components/schemas/LinkedInProfileRole"
            },
            "maxItems": 30,
            "title": "Work History",
            "type": "array"
          }
        },
        "title": "LinkedInProfileContent",
        "type": "object"
      },
      "LinkedInProfilePost": {
        "additionalProperties": false,
        "description": "A post the member wrote, or an article on their profile: its text (or title) and its link.",
        "properties": {
          "text": {
            "anyOf": [
              {
                "maxLength": 3000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Text"
          },
          "url": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Url"
          }
        },
        "title": "LinkedInProfilePost",
        "type": "object"
      },
      "LinkedInProfileRole": {
        "additionalProperties": false,
        "description": "One role on a member's Experience section, as a profile read hands it back.\n\nThe keys are the ``work_history`` entry the profile enrichment's suppliers\nemit (``enrichment_catalog.yaml``: company, title, start_at, end_at,\nduration, location, description), and what the profile pane reads, so a\nread lands in the same cell shape. ``company_page`` is the employer's\nLinkedIn page off the entry's link. Dates are partial ISO strings\n(\"2024-02\", or \"2024\"); an open role has ``end_at`` None.",
        "properties": {
          "company": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company"
          },
          "company_page": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Page"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "duration": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Duration"
          },
          "end_at": {
            "anyOf": [
              {
                "maxLength": 10,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "End At"
          },
          "location": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Location"
          },
          "start_at": {
            "anyOf": [
              {
                "maxLength": 10,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Start At"
          },
          "title": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          }
        },
        "title": "LinkedInProfileRole",
        "type": "object"
      },
      "LinkedInProfileSchool": {
        "additionalProperties": false,
        "description": "One school on a member's Education section, as a profile read hands it back.\n\nThe keys are the ``education`` entry the suppliers emit and the profile\npane reads: the degree and the field, as the profile wrote them, go in\n``description``, which is what the pane draws under the school's name.",
        "properties": {
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "end_at": {
            "anyOf": [
              {
                "maxLength": 10,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "End At"
          },
          "school": {
            "anyOf": [
              {
                "maxLength": 300,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "School"
          },
          "start_at": {
            "anyOf": [
              {
                "maxLength": 10,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Start At"
          }
        },
        "title": "LinkedInProfileSchool",
        "type": "object"
      },
      "LinkedInQueueState": {
        "description": "Where one step stands in its account's line, for the people waiting on it.\n\n``RUNNING`` is in a browser now. ``QUEUED`` is in line, with how many are\nahead of it and when it is expected to start. The rest say why the line is\nnot moving for it: a daily or weekly limit reached for its kind, a limit\nset to zero (``KIND_DISABLED``, which no reset lifts), no browser checked\nin for longer than ``offline_warning_seconds``, LinkedIn asking the member\nto verify the account (a checkpoint), or the account disconnected. Not\n\"paused\", which is already what a sequence is when a person stops it.\n\nThe last two were one \"account blocked\" state. They are two because the fix\nis different and the words have to say which: a checkpoint is cleared in\nthe connected Chrome, a disconnect by connecting again.\n\n``OUTSIDE_WINDOW`` is a step whose sequence's sending hours are shut now in\nits sender's timezone (2026-10-01); it outranks every state but the\naccount's own, since nothing else moves it before the hours open.\n\n``CHECKING_REPLIES`` is a LinkedIn message in line that waits for its\nsender's inbox to be read first (2026-10-05): no time is named, since it\ngoes once a check reads the whole inbox.",
        "enum": [
          "running",
          "queued",
          "checking_replies",
          "outside_window",
          "daily_limit",
          "weekly_limit",
          "kind_disabled",
          "browser_offline",
          "verify_account",
          "disconnected"
        ],
        "title": "LinkedInQueueState",
        "type": "string"
      },
      "LinkedInReleaseReason": {
        "description": "Why a browser handed back a step it holds without settling it.\n\n``verified_absent``: it looked and found the step not done, and may not\nfinish it now (a held or cancelled step's look). ``reopen_paused``: the\nperson closed the working tab again, so this browser stopped reopening it.\nNeither counts against the step: a run cut off under it is reported as an\nattempt instead.",
        "enum": [
          "verified_absent",
          "reopen_paused"
        ],
        "title": "LinkedInReleaseReason",
        "type": "string"
      },
      "LinkedInRepliesCheckReadSchema": {
        "description": "Whether the sender's LinkedIn inbox is being read, for the messages that wait on it.\n\nA message goes out only on an inbox read in full within the last few hours,\nso it never reaches somebody who has already replied. The sender's tab\nshows only the failing state.",
        "properties": {
          "failing": {
            "description": "Whether a message is waiting on a reading of the inbox while the checks keep failing since last_read_at.",
            "title": "Failing",
            "type": "boolean"
          },
          "holding": {
            "default": false,
            "description": "Whether LinkedIn messages wait for a reading of the inbox right now; false once the checks have failed for long enough that they go without one.",
            "title": "Holding",
            "type": "boolean"
          },
          "last_read_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the whole inbox was last read; null when no reading has worked yet.",
            "title": "Last Read At"
          }
        },
        "required": [
          "last_read_at",
          "failing"
        ],
        "title": "LinkedInRepliesCheckReadSchema",
        "type": "object"
      },
      "LinkedInRunPhase": {
        "description": "How far a build that resumes says a running step got, on each check-in.\n\n``claimed``: handed over, nothing done. ``navigated``: on the page.\n``dispatched``: the step's own work started. ``committing``: a press that\nchanges LinkedIn was granted and is under way. ``committed``: it was made.\nInformation for the team and for the next look; the grant, not the\nphase, is what says something may have happened.",
        "enum": [
          "claimed",
          "navigated",
          "dispatched",
          "committing",
          "committed"
        ],
        "title": "LinkedInRunPhase",
        "type": "string"
      },
      "LinkedInScheduleBlock": {
        "description": "The one thing that stops a batch of approved steps from running as scheduled.",
        "enum": [
          "browser_offline",
          "account_blocked",
          "weekly_limit",
          "kind_disabled",
          "outside_window"
        ],
        "title": "LinkedInScheduleBlock",
        "type": "string"
      },
      "LinkedInSenderLeaderboardRowReadSchema": {
        "description": "One LinkedIn-connected sender's outcomes. Null = unknowable.",
        "properties": {
          "connections_accepted": {
            "title": "Connections Accepted",
            "type": "integer"
          },
          "connections_sent": {
            "title": "Connections Sent",
            "type": "integer"
          },
          "messages_sent": {
            "title": "Messages Sent",
            "type": "integer"
          },
          "replies": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Replies"
          },
          "sender_profile_id": {
            "format": "uuid",
            "title": "Sender Profile Id",
            "type": "string"
          },
          "sender_profile_name": {
            "title": "Sender Profile Name",
            "type": "string"
          }
        },
        "required": [
          "sender_profile_id",
          "sender_profile_name",
          "connections_sent",
          "connections_accepted",
          "messages_sent",
          "replies"
        ],
        "title": "LinkedInSenderLeaderboardRowReadSchema",
        "type": "object"
      },
      "LinkedInSettingsUpdateSchema": {
        "properties": {
          "daily_limit_check_connections": {
            "anyOf": [
              {
                "maximum": 100.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "description": "Readings of the sender's newest connections a day, which notice accepted connection requests. Zero stops them.",
            "title": "Daily Limit Check Connections"
          },
          "daily_limit_check_inbox": {
            "anyOf": [
              {
                "maximum": 100.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Limit Check Inbox"
          },
          "daily_limit_check_sent_invitations": {
            "anyOf": [
              {
                "maximum": 100.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Limit Check Sent Invitations"
          },
          "daily_limit_company_employees_view": {
            "anyOf": [
              {
                "maximum": 50.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "description": "Company People tab searches a day. Zero stops them.",
            "title": "Daily Limit Company Employees View"
          },
          "daily_limit_company_profile_view": {
            "anyOf": [
              {
                "maximum": 200.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "description": "Company page views a day. Zero stops them.",
            "title": "Daily Limit Company Profile View"
          },
          "daily_limit_connection_request": {
            "anyOf": [
              {
                "maximum": 200.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Limit Connection Request"
          },
          "daily_limit_follow": {
            "anyOf": [
              {
                "maximum": 200.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Limit Follow"
          },
          "daily_limit_like_post": {
            "anyOf": [
              {
                "maximum": 200.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Limit Like Post"
          },
          "daily_limit_profile_view": {
            "anyOf": [
              {
                "maximum": 500.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Limit Profile View"
          },
          "daily_limit_read_conversation": {
            "anyOf": [
              {
                "maximum": 500.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Limit Read Conversation"
          },
          "daily_limit_send_message": {
            "anyOf": [
              {
                "maximum": 500.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "description": "Messages and InMails a day, counted together.",
            "title": "Daily Limit Send Message"
          },
          "daily_limit_withdraw": {
            "anyOf": [
              {
                "maximum": 200.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Limit Withdraw"
          },
          "min_action_interval_seconds": {
            "anyOf": [
              {
                "maximum": 3600.0,
                "minimum": 60.0,
                "type": "integer"
              },
              {}
            ],
            "description": "The least time between two steps on this account, in seconds, from 60 to 3,600. The gap actually waited is widened at random by up to 40%, so steps never land on an exact cadence.",
            "title": "Min Action Interval Seconds"
          },
          "run_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInApprovalMode"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "Whether a person approves this sender's LinkedIn steps on Tasks before they run (manual) or they are queued without asking (auto). Switching to manual takes back the steps queued without asking that no browser has started; switching to auto queues the ones that waited only for this setting. Null returns it to never set, which runs as manual.",
            "title": "Run Mode"
          },
          "weekly_connection_request_cap": {
            "anyOf": [
              {
                "maximum": 1000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Weekly Connection Request Cap"
          },
          "weekly_limit_check_connections": {
            "anyOf": [
              {
                "maximum": 700.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Check Connections"
          },
          "weekly_limit_check_inbox": {
            "anyOf": [
              {
                "maximum": 700.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Check Inbox"
          },
          "weekly_limit_check_sent_invitations": {
            "anyOf": [
              {
                "maximum": 700.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Check Sent Invitations"
          },
          "weekly_limit_company_employees_view": {
            "anyOf": [
              {
                "maximum": 350.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Company Employees View"
          },
          "weekly_limit_company_profile_view": {
            "anyOf": [
              {
                "maximum": 1400.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Company Profile View"
          },
          "weekly_limit_follow": {
            "anyOf": [
              {
                "maximum": 1400.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Follow"
          },
          "weekly_limit_like_post": {
            "anyOf": [
              {
                "maximum": 1400.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Like Post"
          },
          "weekly_limit_profile_view": {
            "anyOf": [
              {
                "maximum": 3500.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Profile View"
          },
          "weekly_limit_read_conversation": {
            "anyOf": [
              {
                "maximum": 3500.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Read Conversation"
          },
          "weekly_limit_send_message": {
            "anyOf": [
              {
                "maximum": 3500.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Send Message"
          },
          "weekly_limit_withdraw": {
            "anyOf": [
              {
                "maximum": 1400.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Weekly Limit Withdraw"
          }
        },
        "title": "LinkedInSettingsUpdateSchema",
        "type": "object"
      },
      "LinkedInSkipReason": {
        "description": "The specific reason a step was not applicable, when the driver knows one.\n\nNarrower than the error code beside it: ``not_applicable`` says the step\ncould not apply, and this says why in a way a customer can act on. An\ninvitation already pending is their own earlier work, while \"connect not\noffered\" is LinkedIn's decision about that profile.",
        "enum": [
          "invitation_already_pending",
          "connect_not_offered",
          "email_required",
          "message_not_offered",
          "no_invitation_pending",
          "already_connected",
          "profile_not_resolved",
          "vanity_changed",
          "company_not_resolved",
          "no_people_found"
        ],
        "title": "LinkedInSkipReason",
        "type": "string"
      },
      "LinkedInStatsReadSchema": {
        "properties": {
          "avg_duration_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Avg Duration Ms"
          },
          "failed": {
            "title": "Failed",
            "type": "integer"
          },
          "rejected": {
            "title": "Rejected",
            "type": "integer"
          },
          "skipped": {
            "title": "Skipped",
            "type": "integer"
          },
          "succeeded": {
            "title": "Succeeded",
            "type": "integer"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "total",
          "succeeded",
          "failed",
          "rejected",
          "skipped",
          "avg_duration_ms"
        ],
        "title": "LinkedInStatsReadSchema",
        "type": "object"
      },
      "LinkedInStepTableSchema": {
        "description": "The table whose enrichment column queued a step.",
        "properties": {
          "column_name": {
            "description": "The enrichment column the step fills, empty once that column is deleted.",
            "title": "Column Name",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "description": "The table's name, as the step is labelled on the sender's list.",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "column_name"
        ],
        "title": "LinkedInStepTableSchema",
        "type": "object"
      },
      "LinkedInStreamEventSchema": {
        "description": "One frame of the sender's live stream, as the documentation describes it.\n\nThe stream is a wake-up channel, not a data channel: every frame names what\nchanged and the client re-reads. ``kind`` is the SSE ``event:`` field:\n``hello``, ``resync``, ``reconnect``, or one of the account signals\n(``state_changed``, ``disconnected``, ``action_queued``, ``action_cancelled``).",
        "properties": {
          "account_id": {
            "format": "uuid",
            "title": "Account Id",
            "type": "string"
          },
          "action_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Action Id"
          },
          "at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "At"
          },
          "kind": {
            "title": "Kind",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "account_id"
        ],
        "title": "LinkedInStreamEventSchema",
        "type": "object"
      },
      "LinkedInTableStepsBulkCancelResponseSchema": {
        "description": "What a cancel of a table column's queued steps did.",
        "properties": {
          "updated": {
            "description": "How many queued steps were taken out of the line, or would be on a dry run.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated"
        ],
        "title": "LinkedInTableStepsBulkCancelResponseSchema",
        "type": "object"
      },
      "LinkedInTableStepsBulkCancelSchema": {
        "additionalProperties": false,
        "description": "Which table column's queued steps to take out of the sender's line.\n\nThe selection is the From tables list's own filters (``GET \u2026/table-steps/``),\nboth required: a cancel takes one column's steps.",
        "properties": {
          "column_id": {
            "description": "The table's LinkedIn column whose steps to cancel.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "table_id": {
            "description": "The table whose column queued the steps.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "column_id"
        ],
        "title": "LinkedInTableStepsBulkCancelSchema",
        "type": "object"
      },
      "LinkedInTableStepsColumnSchema": {
        "description": "One table column's steps in a sender's line, counted.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "description": "The enrichment column the steps fill, empty once that column is deleted.",
            "title": "Column Name",
            "type": "string"
          },
          "queued": {
            "description": "Its steps waiting for a browser: the ones a cancel takes out.",
            "title": "Queued",
            "type": "integer"
          },
          "running": {
            "description": "Its steps in a browser now, which finish whatever happens.",
            "title": "Running",
            "type": "integer"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "description": "The table's name.",
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "column_id",
          "column_name",
          "queued",
          "running"
        ],
        "title": "LinkedInTableStepsColumnSchema",
        "type": "object"
      },
      "LinkedInTableStepsReadSchema": {
        "description": "The sender's steps that tables queued, per table column.",
        "properties": {
          "columns": {
            "description": "Each table column with steps in the sender's line, the most first.",
            "items": {
              "$ref": "#/components/schemas/LinkedInTableStepsColumnSchema"
            },
            "title": "Columns",
            "type": "array"
          }
        },
        "required": [
          "columns"
        ],
        "title": "LinkedInTableStepsReadSchema",
        "type": "object"
      },
      "LinkedInTryConnectionRequestSchema": {
        "additionalProperties": false,
        "description": "Send the person a connection request, with or without a note.",
        "properties": {
          "kind": {
            "const": "connection_request",
            "title": "Kind",
            "type": "string"
          },
          "note": {
            "default": "",
            "description": "The note, up to the 200 characters a free LinkedIn account will send. Empty sends none.",
            "maxLength": 200,
            "title": "Note",
            "type": "string"
          },
          "profile_url": {
            "description": "Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.",
            "maxLength": 512,
            "minLength": 1,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "profile_url"
        ],
        "title": "LinkedInTryConnectionRequestSchema",
        "type": "object"
      },
      "LinkedInTryFollowContactSchema": {
        "additionalProperties": false,
        "description": "Follow the person without connecting.",
        "properties": {
          "kind": {
            "const": "follow_contact",
            "title": "Kind",
            "type": "string"
          },
          "profile_url": {
            "description": "Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.",
            "maxLength": 512,
            "minLength": 1,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "profile_url"
        ],
        "title": "LinkedInTryFollowContactSchema",
        "type": "object"
      },
      "LinkedInTryLikeLatestPostSchema": {
        "additionalProperties": false,
        "description": "Like the person's latest post.",
        "properties": {
          "kind": {
            "const": "like_latest_post",
            "title": "Kind",
            "type": "string"
          },
          "profile_url": {
            "description": "Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.",
            "maxLength": 512,
            "minLength": 1,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "profile_url"
        ],
        "title": "LinkedInTryLikeLatestPostSchema",
        "type": "object"
      },
      "LinkedInTryProfileViewSchema": {
        "additionalProperties": false,
        "description": "View the person's profile.",
        "properties": {
          "kind": {
            "const": "profile_view",
            "title": "Kind",
            "type": "string"
          },
          "profile_url": {
            "description": "Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.",
            "maxLength": 512,
            "minLength": 1,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "profile_url"
        ],
        "title": "LinkedInTryProfileViewSchema",
        "type": "object"
      },
      "LinkedInTrySendMessageSchema": {
        "additionalProperties": false,
        "description": "Send the person a message, opened from their profile.",
        "properties": {
          "body": {
            "description": "The message.",
            "maxLength": 8000,
            "minLength": 1,
            "title": "Body",
            "type": "string"
          },
          "kind": {
            "const": "send_message",
            "title": "Kind",
            "type": "string"
          },
          "profile_url": {
            "description": "Whose profile, in any shape LinkedIn uses: a vanity URL, a bare slug, a Sales Navigator link.",
            "maxLength": 512,
            "minLength": 1,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "profile_url",
          "body"
        ],
        "title": "LinkedInTrySendMessageSchema",
        "type": "object"
      },
      "LinkedInTryStepSchema": {
        "additionalProperties": false,
        "description": "Queue one step by hand, to watch the channel work.\n\nOnly the kinds the extension implements that act on one named profile. An\nInMail spends the sender's own Premium credits, and the reads of the\nsender's own lists act on nobody, so neither is offered. Each kind carries\nonly its own inputs: a note for a connection request, a body for a message.",
        "properties": {
          "step": {
            "description": "What to do, and to whom.",
            "discriminator": {
              "mapping": {
                "connection_request": "#/components/schemas/LinkedInTryConnectionRequestSchema",
                "follow_contact": "#/components/schemas/LinkedInTryFollowContactSchema",
                "like_latest_post": "#/components/schemas/LinkedInTryLikeLatestPostSchema",
                "profile_view": "#/components/schemas/LinkedInTryProfileViewSchema",
                "send_message": "#/components/schemas/LinkedInTrySendMessageSchema",
                "withdraw_connection_request": "#/components/schemas/LinkedInTryWithdrawConnectionRequestSchema"
              },
              "propertyName": "kind"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/LinkedInTryProfileViewSchema"
              },
              {
                "$ref": "#/components/schemas/LinkedInTryConnectionRequestSchema"
              },
              {
                "$ref": "#/components/schemas/LinkedInTrySendMessageSchema"
              },
              {
                "$ref": "#/components/schemas/LinkedInTryWithdrawConnectionRequestSchema"
              },
              {
                "$ref": "#/components/schemas/LinkedInTryFollowContactSchema"
              },
              {
                "$ref": "#/components/schemas/LinkedInTryLikeLatestPostSchema"
              }
            ],
            "title": "Step"
          }
        },
        "required": [
          "step"
        ],
        "title": "LinkedInTryStepSchema",
        "type": "object"
      },
      "LinkedInTryWithdrawConnectionRequestSchema": {
        "additionalProperties": false,
        "description": "Withdraw the connection request pending to the person.",
        "properties": {
          "kind": {
            "const": "withdraw_connection_request",
            "title": "Kind",
            "type": "string"
          },
          "profile_url": {
            "description": "Whose profile, in any shape LinkedIn uses. A connection request to them must be pending: it is the one withdrawn.",
            "maxLength": 512,
            "minLength": 1,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "profile_url"
        ],
        "title": "LinkedInTryWithdrawConnectionRequestSchema",
        "type": "object"
      },
      "LinkedInWaitReadSchema": {
        "description": "What the account's next step is waiting on, and until when.",
        "properties": {
          "next_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the next step may start: the end of the time between steps for pacing, the reset for daily_cap and weekly_cap, when the hours open for outside_window, and null otherwise.",
            "title": "Next At"
          },
          "reason": {
            "$ref": "#/components/schemas/LinkedInWaitReason",
            "description": "The one reason the next step has not started, highest first: not_connected, checkpoint, lease_held_elsewhere (another browser drives the account), in_flight (a step is running), outside_window (the work that could run waits for its sequences' sending hours, in the sender's timezone), idle (nothing is queued; a step that waits for a person waits on Tasks before it is queued), daily_cap, weekly_cap or kind_disabled (every kind that could run is held by a limit, or a limit set to zero), pacing (the time between steps), or ready."
          },
          "resets_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The moment a daily or weekly limit next frees a slot, midnight in the sender's timezone; null for every other reason. A moment, never 'today' or 'tomorrow'.",
            "title": "Resets At"
          }
        },
        "required": [
          "reason",
          "next_at",
          "resets_at"
        ],
        "title": "LinkedInWaitReadSchema",
        "type": "object"
      },
      "LinkedInWaitReason": {
        "description": "Why an account's next step has not started, as one reason, highest first.\n\n``OUTSIDE_WINDOW`` is work that could run but for its run window, shut now\nin the sender's timezone (2026-10-01); ``IDLE`` is nothing waiting in line.\n``DAILY_CAP``, ``WEEKLY_CAP`` and ``KIND_DISABLED`` are named only when\nevery kind that could be handed out is held by one. ``CHECKING_REPLIES``\nis a message waiting for the inbox to be read first (2026-10-05): one is\nnever sent on an inbox last read hours ago, or past a reply nobody has\nread yet. ``PACING`` is the time between steps, ``READY`` a step that may\nstart now. ``INSUFFICIENT_CREDITS`` is a workspace with no credit left: the\ngovernor's own reading never names it (it reserves nothing), and the\ndashboard's account read puts it over the reasons a balance outranks\n(2026-10-06), as the side panel does off a refused claim.",
        "enum": [
          "not_connected",
          "checkpoint",
          "lease_held_elsewhere",
          "in_flight",
          "outside_window",
          "idle",
          "daily_cap",
          "weekly_cap",
          "kind_disabled",
          "checking_replies",
          "pacing",
          "ready",
          "insufficient_credits"
        ],
        "title": "LinkedInWaitReason",
        "type": "string"
      },
      "ListIntegrationsFilterParamsSchema": {
        "description": "Filter parameters for list and count integration endpoints.",
        "properties": {
          "capability": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IntegrationCapability"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only integrations whose tool can do this for at least one record type: 'list_records' (a table can import from it), 'write_records' (a table can export to it) or 'get_record' (a lookup column can fetch one record from it by an identity value). Read off the tool's capabilities, so it costs no network call."
          },
          "integration_type__not": {
            "anyOf": [
              {
                "items": {
                  "maxLength": 255,
                  "type": "string"
                },
                "maxItems": 50,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Exclude integrations with these integration types",
            "title": "Integration Type  Not"
          },
          "kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IntegrationKindFilter"
              },
              {
                "type": "null"
              }
            ],
            "description": "Filter by integration kind (source, destination, or both)"
          },
          "record_type__in": {
            "anyOf": [
              {
                "items": {
                  "maxLength": 255,
                  "type": "string"
                },
                "maxItems": 50,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Filter to integrations that handle any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.",
            "title": "Record Type  In"
          },
          "search": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Search integrations by name or type. Multi-word queries use AND logic.",
            "title": "Search"
          }
        },
        "title": "ListIntegrationsFilterParamsSchema",
        "type": "object"
      },
      "ListingField": {
        "description": "The listing fields a fill-rate floor or a report can name.",
        "enum": [
          "name",
          "listing_url",
          "listed_on",
          "listed_at",
          "tagline",
          "description",
          "website",
          "logo_url",
          "source_tags",
          "votes",
          "comments",
          "promoted",
          "makers",
          "maker_has_x",
          "maker_has_linkedin",
          "x_handle",
          "linkedin_url",
          "location",
          "country",
          "batch",
          "team_size",
          "hiring",
          "company_status",
          "revenue_monthly_usd",
          "for_sale",
          "asking_price_usd",
          "open_source",
          "pricing",
          "post_kind"
        ],
        "title": "ListingField",
        "type": "string"
      },
      "LocalBusinessQuerySchema": {
        "description": "Filters for a map search over business listings.\n\nThe one search here that asks \"who is within this radius\". Name a category,\na business name or a website to look for, plus an area to look in for the\nradius part.",
        "properties": {
          "area": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GeoFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where to search, and how far around it."
          },
          "categories": {
            "description": "Business categories to include, in the data source's own vocabulary.",
            "items": {
              "type": "string"
            },
            "maxItems": 10,
            "title": "Categories",
            "type": "array"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 200,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words in the business description.",
            "title": "Description"
          },
          "domain": {
            "anyOf": [
              {
                "maxLength": 200,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only the listing on this domain.",
            "title": "Domain"
          },
          "has_phone": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only listings that do (or do not) show a phone number."
          },
          "has_website": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only listings that do (or do not) link a website."
          },
          "is_claimed": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only listings the owner has (or has not) claimed."
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 200,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words in the business name.",
            "title": "Name"
          },
          "price_level": {
            "description": "Price bands to include: inexpensive, moderate, expensive or very_expensive.",
            "items": {
              "enum": [
                "inexpensive",
                "moderate",
                "expensive",
                "very_expensive"
              ],
              "type": "string"
            },
            "maxItems": 4,
            "title": "Price Level",
            "type": "array"
          },
          "rating": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DecimalRangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Star rating range, out of five."
          },
          "review_count": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many reviews the listing has."
          }
        },
        "title": "LocalBusinessQuerySchema",
        "type": "object"
      },
      "LookalikeMatch": {
        "description": "How close a similarity search has to be: one choice that tunes two knobs.\n\nThe two knobs used to be typed as numbers, a ranking weight from -1 to 1\nand a score floor from 0 to 1, and both read like every other filter on\nthe page while meaning something no other filter means. Three named\nlevels say what a person actually wants; ``LOOKALIKE_TUNINGS`` says what\neach one sends and keeps.",
        "enum": [
          "broad",
          "balanced",
          "exact"
        ],
        "title": "LookalikeMatch",
        "type": "string"
      },
      "LookalikeQuerySchema": {
        "description": "Filters for a search for companies resembling a set of seed companies.",
        "properties": {
          "match": {
            "$ref": "#/components/schemas/LookalikeMatch",
            "default": "balanced",
            "description": "How close a match to look for. Broad favours larger, more established companies and keeps every match. Balanced is the default ranking. Exact favours the companies most like the seeds and keeps only the closest matches, so it can add fewer rows than the count shows."
          },
          "seed_domains": {
            "description": "The company domains to find lookalikes of, between 1 and 10. At least one is required, since nothing else can anchor a similarity search.",
            "items": {
              "type": "string"
            },
            "maxItems": 10,
            "title": "Seed Domains",
            "type": "array"
          },
          "seed_rows": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/PreviewPickSchema"
                },
                "maxItems": 10,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Companies ticked in a preview of a company search, by the ref the preview gave each row (`row_refs`): seeds whose websites stay on the server. They count toward the 10 seeds with seed_domains.",
            "title": "Seed Rows"
          }
        },
        "title": "LookalikeQuerySchema",
        "type": "object"
      },
      "LookupIdentityFieldSchema": {
        "description": "One identity field a live connection accepts for a record type.",
        "properties": {
          "field": {
            "description": "A field a lookup may key on ('id', 'email', ...), as the tool names it.",
            "title": "Field",
            "type": "string"
          }
        },
        "required": [
          "field"
        ],
        "title": "LookupIdentityFieldSchema",
        "type": "object"
      },
      "MailboxActivityPointSchema": {
        "description": "One day of the mailbox detail chart.\n\nThree DISJOINT counts, which is why \"received\" is gone. It was all inbound\nmail (replies plus out-of-office plus bounces), so it contained `replies`\nrather than standing beside it, and two lines where one is a slice of the\nother read as two measures of the same thing. Bounces is the half of the\nold total anybody acts on; out-of-office is the half nobody does.",
        "properties": {
          "bounces": {
            "title": "Bounces",
            "type": "integer"
          },
          "day": {
            "format": "date-time",
            "title": "Day",
            "type": "string"
          },
          "replies": {
            "title": "Replies",
            "type": "integer"
          },
          "sent": {
            "title": "Sent",
            "type": "integer"
          }
        },
        "required": [
          "day",
          "sent",
          "replies",
          "bounces"
        ],
        "title": "MailboxActivityPointSchema",
        "type": "object"
      },
      "MailboxActivityReadSchema": {
        "description": "A mailbox's activity over a window, one row per day and per recipient domain.\n\nThe bounces themselves are a list of their own, ``GET /mailboxes/{mailbox_id}/bounces/``.",
        "properties": {
          "points": {
            "items": {
              "$ref": "#/components/schemas/MailboxActivityPointSchema"
            },
            "title": "Points",
            "type": "array"
          },
          "providers": {
            "items": {
              "$ref": "#/components/schemas/MailboxRecipientProviderSchema"
            },
            "title": "Providers",
            "type": "array"
          }
        },
        "required": [
          "points",
          "providers"
        ],
        "title": "MailboxActivityReadSchema",
        "type": "object"
      },
      "MailboxBounceSchema": {
        "description": "One message that bounced back to a mailbox, and who it was for.",
        "properties": {
          "at": {
            "description": "When the bounce arrived.",
            "format": "date-time",
            "title": "At",
            "type": "string"
          },
          "id": {
            "description": "The bounce message's id.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "recipient": {
            "description": "The address that bounced: the thread's contact, or `unknown`.",
            "title": "Recipient",
            "type": "string"
          },
          "severity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`hard` or `soft`; null when it was not read.",
            "title": "Severity"
          }
        },
        "required": [
          "id",
          "recipient",
          "severity",
          "at"
        ],
        "title": "MailboxBounceSchema",
        "type": "object"
      },
      "MailboxBulkDeleteResponseSchema": {
        "description": "What deleting many mailboxes removed, and who that stops; the same on a dry run.",
        "properties": {
          "count": {
            "default": 1,
            "description": "The number of resources that were deleted.",
            "title": "Count",
            "type": "integer"
          },
          "detail": {
            "description": "The detail of why the resource was deleted.",
            "title": "Detail",
            "type": "string"
          },
          "emailed_contacts": {
            "description": "Every contact these mailboxes have ever emailed, or a Browser use step assigned them; no other mailbox emails them.",
            "title": "Emailed Contacts",
            "type": "integer"
          },
          "sequences": {
            "items": {
              "$ref": "#/components/schemas/MailboxSequenceImpactSchema"
            },
            "title": "Sequences",
            "type": "array"
          },
          "stopped": {
            "description": "Live contacts the change stops. A contact is only ever emailed from the mailbox that first emailed them, so they are never moved to another one.",
            "title": "Stopped",
            "type": "integer"
          },
          "waiting": {
            "description": "Live contacts left waiting until the mailbox is back on a sender.",
            "title": "Waiting",
            "type": "integer"
          }
        },
        "required": [
          "stopped",
          "waiting",
          "sequences",
          "emailed_contacts",
          "detail"
        ],
        "title": "MailboxBulkDeleteResponseSchema",
        "type": "object"
      },
      "MailboxBulkUpdateResponseSchema": {
        "description": "How many mailboxes a bulk edit changed, and who a change of sender reaches.",
        "properties": {
          "emailed_contacts": {
            "description": "Every contact these mailboxes have ever emailed, or a Browser use step assigned them; no other mailbox emails them.",
            "title": "Emailed Contacts",
            "type": "integer"
          },
          "sequences": {
            "items": {
              "$ref": "#/components/schemas/MailboxSequenceImpactSchema"
            },
            "title": "Sequences",
            "type": "array"
          },
          "stopped": {
            "description": "Live contacts the change stops. A contact is only ever emailed from the mailbox that first emailed them, so they are never moved to another one.",
            "title": "Stopped",
            "type": "integer"
          },
          "updated": {
            "description": "How many mailboxes were changed.",
            "title": "Updated",
            "type": "integer"
          },
          "waiting": {
            "description": "Live contacts left waiting until the mailbox is back on a sender.",
            "title": "Waiting",
            "type": "integer"
          }
        },
        "required": [
          "stopped",
          "waiting",
          "sequences",
          "emailed_contacts",
          "updated"
        ],
        "title": "MailboxBulkUpdateResponseSchema",
        "type": "object"
      },
      "MailboxBulkUpdateSchema": {
        "description": "One edit applied to many mailboxes.\n\nA field omitted from the request is left unchanged on every mailbox; a\nfield sent explicitly (even as an empty string) is applied to all of them.",
        "properties": {
          "daily_send_limit": {
            "anyOf": [
              {
                "maximum": 2000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Send Limit"
          },
          "mailbox_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 500,
            "minItems": 1,
            "title": "Mailbox Ids",
            "type": "array"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Sender Profile Id"
          }
        },
        "required": [
          "mailbox_ids"
        ],
        "title": "MailboxBulkUpdateSchema",
        "type": "object"
      },
      "MailboxBulkVerifyResponseSchema": {
        "properties": {
          "data": {
            "description": "The re-checked mailboxes, each at its status after the check.",
            "items": {
              "$ref": "#/components/schemas/MailboxReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "unreachable": {
            "description": "The mailboxes that could not be reached: Google did not answer, turned the check away for a rate or quota limit, or the stored access could not be used. Each keeps the status it had and was not re-checked.",
            "items": {
              "$ref": "#/components/schemas/MailboxReadSchema"
            },
            "title": "Unreachable",
            "type": "array"
          },
          "updated": {
            "description": "How many mailboxes were re-checked: the length of `data`.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "data",
          "unreachable"
        ],
        "title": "MailboxBulkVerifyResponseSchema",
        "type": "object"
      },
      "MailboxBulkVerifySchema": {
        "description": "Which mailboxes to re-check: the ones named, or every mailbox with `all`.",
        "properties": {
          "all": {
            "default": false,
            "description": "Re-check every mailbox in the workspace. Only honoured when no ids are given.",
            "title": "All",
            "type": "boolean"
          },
          "mailbox_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The mailboxes to re-check.",
            "title": "Mailbox Ids"
          }
        },
        "title": "MailboxBulkVerifySchema",
        "type": "object"
      },
      "MailboxConnectionStatus": {
        "description": "Whether the mailbox's grant currently authenticates.",
        "enum": [
          "connected",
          "disconnected"
        ],
        "title": "MailboxConnectionStatus",
        "type": "string"
      },
      "MailboxCountSchema": {
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "MailboxCountSchema",
        "type": "object"
      },
      "MailboxHealth": {
        "description": "The three states the Status column draws, as one filterable value.\n\nDERIVED, never stored: it folds ``connection_status`` together with whether\n``last_verified_at`` holds a stamp. A mailbox nobody has checked since it\nconnected and one checked this morning are different answers to \"is this\ngrant still good?\", and the ops screen has to be able to ask for either.\n\nDeliberately NOT members of :class:`MailboxConnectionStatus`. That enum is\nthe stored column type and the value on every mailbox response, and eleven\nplaces in the domain compare against ``CONNECTED`` by identity. A third\nmember there would put a value on the wire that no row can hold and would\nsilently weaken every one of those checks. Two callers also already send\n``connection_status=connected`` meaning \"not broken\" (the send-a-test picker\nand the notification settings page), and they must keep that meaning.",
        "enum": [
          "verified",
          "connected",
          "disconnected"
        ],
        "title": "MailboxHealth",
        "type": "string"
      },
      "MailboxIssue": {
        "description": "Why the mailbox a contact is emailed from cannot send for them right now.\n\nRead at the time, never stored. The first two stop the contact, because\nnothing on its own brings the address back to this sequence; the last two\nmake them wait, because a reconnect or a sender does.",
        "enum": [
          "deleted",
          "not_on_sequence",
          "disconnected",
          "no_sender"
        ],
        "title": "MailboxIssue",
        "type": "string"
      },
      "MailboxOverviewReadSchema": {
        "properties": {
          "connected_mailboxes": {
            "title": "Connected Mailboxes",
            "type": "integer"
          },
          "daily_ceiling": {
            "description": "Sum of every connected mailbox's daily send limit.",
            "title": "Daily Ceiling",
            "type": "integer"
          },
          "disconnected_mailboxes": {
            "title": "Disconnected Mailboxes",
            "type": "integer"
          },
          "remaining_today": {
            "description": "Workspace capacity left today: sum over connected mailboxes of max(0, daily send limit - sent today). Zero when no mailbox is connected, not a missing number.",
            "title": "Remaining Today",
            "type": "integer"
          },
          "sent_today": {
            "title": "Sent Today",
            "type": "integer"
          },
          "sent_yesterday": {
            "title": "Sent Yesterday",
            "type": "integer"
          },
          "total_mailboxes": {
            "title": "Total Mailboxes",
            "type": "integer"
          }
        },
        "required": [
          "total_mailboxes",
          "connected_mailboxes",
          "disconnected_mailboxes",
          "sent_today",
          "sent_yesterday",
          "daily_ceiling",
          "remaining_today"
        ],
        "title": "MailboxOverviewReadSchema",
        "type": "object"
      },
      "MailboxProvider": {
        "description": "Which email provider a mailbox connects through.\n\nOnly Google Workspace ships so far; every provider is implemented behind\n``providers.EmailProviderBase`` so Office 365 and IMAP/SMTP can be added\nlater without touching callers.\n\n``GOOGLE_WORKSPACE`` holds a per-mailbox OAuth grant (consent screen,\nrefresh token). ``GOOGLE_WORKSPACE_DWD`` holds no grant at all: tokens are\nminted on demand via domain-wide delegation as the platform service\naccount, so its rows carry an empty ``refresh_token`` forever. It is the path\nimported fleets (e.g. InboxKit) connect through.",
        "enum": [
          "google_workspace",
          "google_workspace_dwd"
        ],
        "title": "MailboxProvider",
        "type": "string"
      },
      "MailboxReadSchema": {
        "properties": {
          "bounce_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "DSNs / accepted sends, lifetime.",
            "title": "Bounce Rate"
          },
          "connection_status": {
            "$ref": "#/components/schemas/MailboxConnectionStatus"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "daily_send_limit": {
            "title": "Daily Send Limit",
            "type": "integer"
          },
          "disconnected_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Disconnected At"
          },
          "disconnected_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Disconnected Reason"
          },
          "email_address": {
            "title": "Email Address",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_verified_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the grant last passed its check.",
            "title": "Last Verified At"
          },
          "provider": {
            "$ref": "#/components/schemas/MailboxProvider"
          },
          "reply_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Genuine replies / accepted sends, lifetime.",
            "title": "Reply Rate"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sender Profile Id"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "usage": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MailboxUsageReadSchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "sender_profile_id",
          "provider",
          "email_address",
          "connection_status",
          "daily_send_limit",
          "disconnected_at",
          "disconnected_reason",
          "created_at",
          "updated_at"
        ],
        "title": "MailboxReadSchema",
        "type": "object"
      },
      "MailboxRecipientProviderSchema": {
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          },
          "domain": {
            "title": "Domain",
            "type": "string"
          }
        },
        "required": [
          "domain",
          "count"
        ],
        "title": "MailboxRecipientProviderSchema",
        "type": "object"
      },
      "MailboxRemovalAction": {
        "description": "What removing the InboxKit connection does to its imported mailboxes.\n\nDISCONNECT keeps the mailbox rows and their history; DELETE removes them\noutright (cascading their inbox threads and messages).",
        "enum": [
          "disconnect",
          "delete"
        ],
        "title": "MailboxRemovalAction",
        "type": "string"
      },
      "MailboxSequenceImpactSchema": {
        "description": "One sequence a mailbox change reaches, and how many of its contacts.",
        "properties": {
          "sequence_id": {
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          },
          "sequence_name": {
            "title": "Sequence Name",
            "type": "string"
          },
          "stopped": {
            "description": "Live contacts in this sequence the change stops.",
            "title": "Stopped",
            "type": "integer"
          },
          "waiting": {
            "description": "Live contacts in this sequence left waiting for the mailbox.",
            "title": "Waiting",
            "type": "integer"
          }
        },
        "required": [
          "sequence_id",
          "sequence_name",
          "stopped",
          "waiting"
        ],
        "title": "MailboxSequenceImpactSchema",
        "type": "object"
      },
      "MailboxUpdateSchema": {
        "description": "A mailbox's own settings: how much it may send, and who it sends as.\n\nName and signature are NOT here. They belong to the sender, so a\nperson running six inboxes has one identity instead of six copies of it.",
        "properties": {
          "daily_send_limit": {
            "anyOf": [
              {
                "maximum": 2000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Daily Send Limit"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Sender Profile Id"
          }
        },
        "title": "MailboxUpdateSchema",
        "type": "object"
      },
      "MailboxUsageReadSchema": {
        "description": "Volume only; the ceiling it runs against is the mailbox's `daily_send_limit`.",
        "properties": {
          "sent_today": {
            "title": "Sent Today",
            "type": "integer"
          },
          "sent_yesterday": {
            "title": "Sent Yesterday",
            "type": "integer"
          }
        },
        "required": [
          "sent_today",
          "sent_yesterday"
        ],
        "title": "MailboxUsageReadSchema",
        "type": "object"
      },
      "ManualColumnDefinition": {
        "description": "Definition of a manual column: typed, user-editable cells.",
        "properties": {
          "default_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Value"
          },
          "kind": {
            "const": "manual",
            "default": "manual",
            "title": "Kind",
            "type": "string"
          }
        },
        "title": "ManualColumnDefinition",
        "type": "object"
      },
      "MatchLeadValuesRequestSchema": {
        "description": "A pasted list of values to check against one of the product's closed vocabularies.",
        "properties": {
          "field": {
            "$ref": "#/components/schemas/LeadVocabularyField",
            "description": "Which closed vocabulary to check the values against: departments, past_departments, management_levels, past_management_levels, company_size_bands, department (the signal search's own list), company_industry, past_company_industry, industry, company_type (the People search's current employer type and the Companies search's own type share this list) or past_company_type."
          },
          "values": {
            "description": "The raw values, in whatever case or spacing they were pasted or typed in.",
            "items": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Values",
            "type": "array"
          }
        },
        "required": [
          "field",
          "values"
        ],
        "title": "MatchLeadValuesRequestSchema",
        "type": "object"
      },
      "MatchedLeadValuesSchema": {
        "description": "Every pasted value's outcome, in the order it was sent.",
        "properties": {
          "matches": {
            "items": {
              "$ref": "#/components/schemas/LeadValueMatchSchema"
            },
            "title": "Matches",
            "type": "array"
          }
        },
        "required": [
          "matches"
        ],
        "title": "MatchedLeadValuesSchema",
        "type": "object"
      },
      "McpCatalogTileSchema": {
        "description": "One curated MCP server as the connect gallery renders it.",
        "properties": {
          "account_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Account Label"
          },
          "connected_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Connected By User Id"
          },
          "icon": {
            "title": "Icon",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "scope_note": {
            "title": "Scope Note",
            "type": "string"
          },
          "server_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Server Id"
          },
          "slug": {
            "title": "Slug",
            "type": "string"
          },
          "state": {
            "description": "'not_connected', 'active' or 'needs_reconnect'.",
            "title": "State",
            "type": "string"
          },
          "url": {
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "name",
          "icon",
          "url",
          "scope_note",
          "state",
          "server_id",
          "account_label",
          "connected_by_user_id"
        ],
        "title": "McpCatalogTileSchema",
        "type": "object"
      },
      "McpOauthCallbackRequestSchema": {
        "description": "The provider redirect's payload, relayed by the frontend callback page.",
        "properties": {
          "code": {
            "maxLength": 4096,
            "minLength": 1,
            "title": "Code",
            "type": "string"
          },
          "state": {
            "maxLength": 256,
            "minLength": 1,
            "title": "State",
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "title": "McpOauthCallbackRequestSchema",
        "type": "object"
      },
      "McpOauthCallbackResponseSchema": {
        "description": "The finished connection and a live probe of what it can reach.",
        "properties": {
          "server": {
            "$ref": "#/components/schemas/McpServerReadSchema"
          },
          "verify": {
            "$ref": "#/components/schemas/McpServerVerifyResponseSchema"
          }
        },
        "required": [
          "server",
          "verify"
        ],
        "title": "McpOauthCallbackResponseSchema",
        "type": "object"
      },
      "McpOauthConnectRequestSchema": {
        "description": "Which catalog entry to begin (or redo) an OAuth connection for.",
        "properties": {
          "slug": {
            "maxLength": 64,
            "minLength": 1,
            "title": "Slug",
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "title": "McpOauthConnectRequestSchema",
        "type": "object"
      },
      "McpOauthConnectResponseSchema": {
        "description": "Where to send the user's browser to authorize the connection.",
        "properties": {
          "authorize_url": {
            "title": "Authorize Url",
            "type": "string"
          }
        },
        "required": [
          "authorize_url"
        ],
        "title": "McpOauthConnectResponseSchema",
        "type": "object"
      },
      "McpServerCreateSchema": {
        "description": "A new MCP server's configuration.",
        "properties": {
          "enabled": {
            "default": true,
            "title": "Enabled",
            "type": "boolean"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Request headers sent with every call, e.g. Authorization.",
            "title": "Headers",
            "type": "object"
          },
          "name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "url": {
            "maxLength": 2048,
            "minLength": 1,
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "name",
          "url"
        ],
        "title": "McpServerCreateSchema",
        "type": "object"
      },
      "McpServerReadSchema": {
        "description": "One org-level MCP server as the agent editor renders it.",
        "properties": {
          "account_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "OAuth servers only: best-effort account/workspace name of the grant.",
            "title": "Account Label"
          },
          "auth_mode": {
            "description": "How requests authenticate: 'headers' (static) or 'oauth'.",
            "title": "Auth Mode",
            "type": "string"
          },
          "catalog_slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The curated-catalog entry this server came from; null for custom servers.",
            "title": "Catalog Slug"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "enabled": {
            "title": "Enabled",
            "type": "boolean"
          },
          "header_names": {
            "description": "The names of the configured request headers. Values are credentials and are never returned by the API.",
            "items": {
              "type": "string"
            },
            "title": "Header Names",
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "oauth_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "OAuth servers only: 'active' or 'needs_reconnect'; null for static-header servers and never-connected rows.",
            "title": "Oauth Status"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "url": {
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "url",
          "header_names",
          "enabled",
          "auth_mode",
          "catalog_slug",
          "oauth_status",
          "account_label",
          "created_at",
          "updated_at"
        ],
        "title": "McpServerReadSchema",
        "type": "object"
      },
      "McpServerUpdateSchema": {
        "description": "A partial MCP server update; absent fields keep their value.",
        "properties": {
          "enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Enabled"
          },
          "headers": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "When present, REPLACES the whole header dict. Values are never echoed back, so an edit re-enters every kept header.",
            "title": "Headers"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "url": {
            "anyOf": [
              {
                "maxLength": 2048,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Url"
          }
        },
        "title": "McpServerUpdateSchema",
        "type": "object"
      },
      "McpServerVerifyResponseSchema": {
        "description": "A live probe's result; an unreachable server is data, not an error.",
        "properties": {
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "ok": {
            "title": "Ok",
            "type": "boolean"
          },
          "tools": {
            "items": {
              "$ref": "#/components/schemas/McpToolSchema"
            },
            "title": "Tools",
            "type": "array"
          }
        },
        "required": [
          "ok",
          "error",
          "tools"
        ],
        "title": "McpServerVerifyResponseSchema",
        "type": "object"
      },
      "McpToolSchema": {
        "description": "One tool a probed MCP server offers.",
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "input_schema": {
            "additionalProperties": true,
            "title": "Input Schema",
            "type": "object"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "name",
          "description",
          "input_schema"
        ],
        "title": "McpToolSchema",
        "type": "object"
      },
      "MessageClass": {
        "description": "What a message turned out to be; NULL on an ordinary message of ours.\n\nREPLY stops the cadence; BOUNCE (a DSN) marks the contact bounced and never\nlooks like a reply. Intake files every other inbound message from the\ncontact as REPLY (D1, 2026-10-18): OUT_OF_OFFICE (someone away) and\nAUTOMATED (a machine writing back: a ticketing auto-ack, a mailing list, a\nno-reply robot) are on messages filed before then, and are the labeller's\nto set again from its verdict (E4); neither is a person answering, so\nneither counts as a reply. The first four are inbound. FORWARD is ours,\noutbound: a message of the thread passed on to somebody else\n(``service.forward_message``). Nothing\nwas said to the contact, so it is never an answer to them: it does not\nmove a conversation out of the Inbox, count as replied, or end a done mark.",
        "enum": [
          "reply",
          "bounce",
          "out_of_office",
          "automated",
          "forward"
        ],
        "title": "MessageClass",
        "type": "string"
      },
      "MessageConfidence": {
        "description": "The writer's own read on whether its message is ready to send unedited.",
        "enum": [
          "high",
          "medium",
          "low"
        ],
        "title": "MessageConfidence",
        "type": "string"
      },
      "MessageDirection": {
        "enum": [
          "outbound",
          "inbound"
        ],
        "title": "MessageDirection",
        "type": "string"
      },
      "MessageKind": {
        "description": "What one written message is, which decides its rules, its length and its channel.",
        "enum": [
          "email",
          "linkedin_connection_note",
          "linkedin_message",
          "linkedin_inmail",
          "reply_email",
          "reply_linkedin"
        ],
        "title": "MessageKind",
        "type": "string"
      },
      "MessageOverridePutSchema": {
        "description": "Pin the exact message one contact receives. Null subject keeps in-thread.",
        "properties": {
          "body": {
            "maxLength": 50000,
            "minLength": 1,
            "title": "Body",
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          }
        },
        "required": [
          "body"
        ],
        "title": "MessageOverridePutSchema",
        "type": "object"
      },
      "MessageOverrideReadSchema": {
        "description": "One contact's hand-written message for one step.",
        "properties": {
          "body": {
            "title": "Body",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "step_id",
          "record_id",
          "subject",
          "body",
          "updated_at"
        ],
        "title": "MessageOverrideReadSchema",
        "type": "object"
      },
      "MessageReadSchema": {
        "properties": {
          "attachments": {
            "items": {
              "$ref": "#/components/schemas/AttachmentReadSchema"
            },
            "title": "Attachments",
            "type": "array"
          },
          "body_html": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender's raw HTML part; sanitise before rendering.",
            "title": "Body Html"
          },
          "body_text": {
            "title": "Body Text",
            "type": "string"
          },
          "bounce_severity": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BounceSeverity"
              },
              {
                "type": "null"
              }
            ]
          },
          "channel": {
            "$ref": "#/components/schemas/InboxChannel",
            "description": "This message's own channel. Threads merge channels, so the reader captions each message by what it actually is: a LinkedIn DM involves no email addresses."
          },
          "direction": {
            "$ref": "#/components/schemas/MessageDirection"
          },
          "files_pending": {
            "description": "True while the files this email came with are still being read from the mailbox, so `attachments` may not list them yet: it fills in once they are read, and the conversation updates on its own when that happens. False on every other message, including one whose files are already listed and one that came with none.",
            "title": "Files Pending",
            "type": "boolean"
          },
          "from_address": {
            "title": "From Address",
            "type": "string"
          },
          "from_other_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set on an email from the contact's side that did not come from the contact's own address: the address it came from, which may be the contact writing from a second address or someone answering for them, such as a colleague. Compared with the address the conversation holds now. Null on the contact's own mail, on what you sent, on LinkedIn messages and on bounces.",
            "title": "From Other Address"
          },
          "hand_edited": {
            "default": false,
            "description": "A person edited the agent's words before they went, so Needs work is refused on them. False on a message the agent did not write.",
            "title": "Hand Edited",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "looks_good": {
            "default": false,
            "description": "A person marked the agent's words Looks good once they went (PUT /agent-learnings/sent-messages/{message_id}/looks-good/). False on a message the agent did not write.",
            "title": "Looks Good",
            "type": "boolean"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mailbox Id"
          },
          "message_class": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageClass"
              },
              {
                "type": "null"
              }
            ]
          },
          "outbound_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set on a message the agent wrote: a reply its draft became, or a sequence's email or LinkedIn message. A thumbs down on it names this id (POST /agent-learnings/thumbs-downs/ with a sent_message subject). Null on what a person wrote and on everything the contact sent.",
            "title": "Outbound Message Id"
          },
          "send_outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DraftSendOutcome"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set on a message the agent's draft became: as_written when it went out as the agent wrote it, edited when a person changed it first, replaced when a person sent a reply of their own in its place. Null on every other message, and on drafts sent before this was recorded."
          },
          "send_state": {
            "$ref": "#/components/schemas/MessageSendState"
          },
          "sent_at": {
            "format": "date-time",
            "title": "Sent At",
            "type": "string"
          },
          "sent_by_kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageSentByKind"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who sent an outbound message: `person` when someone in your workspace wrote or approved it, `system` when the agent sent it on its own with nobody approving it. Null on messages you received, and on outbound messages where this was not recorded, such as sequence steps and mail sent straight from the mailbox."
          },
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sequence this message belongs to: the one that sent it or, on a reply, the one it answers. That is the sequence whose email the reply names, else the one the contact was in when it arrived, else the conversation's.",
            "title": "Sequence Id"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which step sent this message, or which step's email a reply answers; null on a reply that names no email of ours. Carried per message, not only on the conversation, because a contact in a second sequence keeps their earlier messages' own sequence and step.",
            "title": "Step Id"
          },
          "subject": {
            "title": "Subject",
            "type": "string"
          },
          "thread_id": {
            "format": "uuid",
            "title": "Thread Id",
            "type": "string"
          },
          "to_address": {
            "title": "To Address",
            "type": "string"
          }
        },
        "required": [
          "id",
          "thread_id",
          "mailbox_id",
          "channel",
          "direction",
          "send_state",
          "from_address",
          "to_address",
          "subject",
          "body_text",
          "sent_at",
          "message_class",
          "bounce_severity",
          "attachments",
          "files_pending"
        ],
        "title": "MessageReadSchema",
        "type": "object"
      },
      "MessageSendState": {
        "description": "Whether a message has actually left.\n\nOnly meaningful on LinkedIn. An email row is written after the provider\naccepted it, so it is ``SENT`` the moment it exists; a LinkedIn reply is\nwritten when it is QUEUED, and cannot become ``SENT`` until the customer's\nown browser has delivered it. Showing the two the same way would have the\nproduct assert a delivery it has no evidence for.",
        "enum": [
          "sent",
          "queued",
          "failed"
        ],
        "title": "MessageSendState",
        "type": "string"
      },
      "MessageSentByKind": {
        "description": "Who composed an outbound message: a person, or the product itself.\n\nOnly meaningful outbound, and NULL on anything inbound. The distinction\nexists because an agent-written reply has to stay attributable after the\nfact: \"did a human send this\" is the first question asked of any send that\nturns out to have been wrong, and a column is the only place that answer\nsurvives.",
        "enum": [
          "person",
          "system"
        ],
        "title": "MessageSentByKind",
        "type": "string"
      },
      "MessageStatus": {
        "description": "Where one written message stands.\n\nWRITING is a lease: the model is being asked. WRITTEN, QUEUED (a person is\nlooking at it) and EDITED (a person changed it) are the three sendable\nstates. UNPAID is written but not fully charged, so it is not sendable\nuntil the remainder is collected. SENT, REJECTED, SUPERSEDED and FAILED are\nterminal.",
        "enum": [
          "writing",
          "written",
          "unpaid",
          "queued",
          "sent",
          "edited",
          "rejected",
          "superseded",
          "failed"
        ],
        "title": "MessageStatus",
        "type": "string"
      },
      "MessageTargetSchema": {
        "description": "One message the agent wrote that has not gone out: a follow-up, or a Builder message.",
        "properties": {
          "message_id": {
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          },
          "target_kind": {
            "const": "message",
            "title": "Target Kind",
            "type": "string"
          }
        },
        "required": [
          "target_kind",
          "message_id"
        ],
        "title": "MessageTargetSchema",
        "type": "object"
      },
      "MessageTemplateCreateSchema": {
        "properties": {
          "body_segments": {
            "items": {
              "$ref": "#/components/schemas/TemplateSegmentSchema"
            },
            "title": "Body Segments",
            "type": "array"
          },
          "name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/TemplateScope",
            "default": "sequence_step",
            "description": "The composer this template is being saved from."
          },
          "subject_segments": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TemplateSegmentSchema"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject Segments"
          }
        },
        "required": [
          "name"
        ],
        "title": "MessageTemplateCreateSchema",
        "type": "object"
      },
      "MessageTemplateReadSchema": {
        "description": "One saved template, as segments so variables survive reuse.",
        "properties": {
          "body_segments": {
            "items": {
              "$ref": "#/components/schemas/TemplateSegmentSchema"
            },
            "title": "Body Segments",
            "type": "array"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The person who saved it, whom the library names beside it. Null for a template saved before anyone was recorded.",
            "title": "Created By User Id"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/TemplateScope",
            "description": "Which composer this template belongs to. The picker filters to the surface it was opened from."
          },
          "subject_segments": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TemplateSegmentSchema"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject Segments"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "scope",
          "subject_segments",
          "body_segments",
          "created_at",
          "updated_at"
        ],
        "title": "MessageTemplateReadSchema",
        "type": "object"
      },
      "MessageTemplateUpdateSchema": {
        "description": "Rename and/or re-scope; absent fields stay untouched.",
        "properties": {
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "scope": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TemplateScope"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "title": "MessageTemplateUpdateSchema",
        "type": "object"
      },
      "MissingEmailsEstimateReadSchema": {
        "description": "What finding the audience's missing work emails would cover and cost, before it runs.",
        "properties": {
          "adds_column": {
            "description": "True when that column does not exist yet and finding adds it to the audience table first. Adding it costs nothing.",
            "title": "Adds Column",
            "type": "boolean"
          },
          "balance_sufficient": {
            "description": "Whether the workspace's available credits cover the most it could cost.",
            "title": "Balance Sufficient",
            "type": "boolean"
          },
          "column_name": {
            "description": "The Find work email column the addresses land in, by its name on the table.",
            "title": "Column Name",
            "type": "string"
          },
          "estimated_credits": {
            "description": "The most it could cost, in credits: every row priced in full.",
            "title": "Estimated Credits",
            "type": "number"
          },
          "expected_credits": {
            "description": "What it usually costs, in credits: each row is charged the price of the source that answered it, read from which sources usually answer. Quote it before estimated_credits, never instead of it: about this, up to estimated_credits. When the two are equal the lookup has one price: then quote that one figure, without up to.",
            "title": "Expected Credits",
            "type": "number"
          },
          "rows": {
            "description": "Contacts it would look up: audience rows with no email that a Find work email lookup has not tried yet. The same number the launch check's `contacts_missing_email` finding carries in `count`.",
            "title": "Rows",
            "type": "integer"
          },
          "scope_too_large": {
            "description": "True when more contacts are missing an email than one run may cover. Narrow the audience's view first; running is refused until then.",
            "title": "Scope Too Large",
            "type": "boolean"
          }
        },
        "required": [
          "rows",
          "expected_credits",
          "estimated_credits",
          "balance_sufficient",
          "scope_too_large",
          "column_name",
          "adds_column"
        ],
        "title": "MissingEmailsEstimateReadSchema",
        "type": "object"
      },
      "MissingEmailsFindReadSchema": {
        "description": "The run that is now finding the audience's missing work emails.",
        "properties": {
          "column_id": {
            "description": "The Find work email column the run fills in.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "description": "That column's name on the table.",
            "title": "Column Name",
            "type": "string"
          },
          "rows": {
            "description": "Contacts the run is looking up.",
            "title": "Rows",
            "type": "integer"
          },
          "run": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRunReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The run, or null while its start is still queued; the table's active runs pick it up either way."
          },
          "table_id": {
            "description": "The sequence's audience table.",
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "rows",
          "table_id",
          "column_id",
          "column_name",
          "run"
        ],
        "title": "MissingEmailsFindReadSchema",
        "type": "object"
      },
      "MoveContactRequestSchema": {
        "description": "Where Move to another sequence should put the contact.",
        "properties": {
          "target_sequence_id": {
            "description": "The sequence to move the contact to. It must send to the same table.",
            "format": "uuid",
            "title": "Target Sequence Id",
            "type": "string"
          }
        },
        "required": [
          "target_sequence_id"
        ],
        "title": "MoveContactRequestSchema",
        "type": "object"
      },
      "MultiSelectOptions": {
        "description": "Options for a multi-select column.",
        "properties": {
          "choices": {
            "items": {
              "$ref": "#/components/schemas/SelectChoice"
            },
            "title": "Choices",
            "type": "array"
          },
          "type": {
            "const": "multi_select",
            "default": "multi_select",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "MultiSelectOptions",
        "type": "object"
      },
      "MyGrantReadSchema": {
        "description": "One write the AI Assistant runs without asking you, and only you, in this workspace.\n\nGiven by \"Approve for you, in every conversation\" on an action card. It holds in\nevery conversation of yours here, whatever the conversation or the workspace\nallows, until you take it back.",
        "properties": {
          "tool": {
            "description": "The operation's name, as `GET /assistant/tools/` lists it: the name it has today, even when it was allowed under an older one.",
            "title": "Tool",
            "type": "string"
          }
        },
        "required": [
          "tool"
        ],
        "title": "MyGrantReadSchema",
        "type": "object"
      },
      "NextStepKind": {
        "description": "What a next step offered under a reply is about, which decides the icon it wears.\n\nEach kind wears the icon that thing wears on its own page; ``other`` wears\nthe Chat page's speech bubble.",
        "enum": [
          "business_context",
          "email",
          "phone",
          "sequence",
          "agent",
          "table",
          "search",
          "inbox",
          "mailbox",
          "other"
        ],
        "title": "NextStepKind",
        "type": "string"
      },
      "NodeFunnelReadSchema": {
        "description": "One step's badge: how many wait here, went through, and failed.",
        "properties": {
          "awaiting_answer": {
            "default": 0,
            "description": "On a connection request: contacts whose request went out and whose answer is not in yet, those it already finished included until their answer is recorded. Zero on every other step.",
            "title": "Awaiting Answer",
            "type": "integer"
          },
          "browsing": {
            "default": 0,
            "description": "On a Browser use step: of waiting, the contacts whose run works in a browser now. The rest wait for a browser, or are held. Zero on every other step.",
            "title": "Browsing",
            "type": "integer"
          },
          "executed": {
            "title": "Executed",
            "type": "integer"
          },
          "failed": {
            "title": "Failed",
            "type": "integer"
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "waiting": {
            "title": "Waiting",
            "type": "integer"
          }
        },
        "required": [
          "step_id",
          "waiting",
          "executed",
          "failed"
        ],
        "title": "NodeFunnelReadSchema",
        "type": "object"
      },
      "NotAddedReason": {
        "description": "Why people an import found are not all rows in the table.\n\n``found_twice``: a new table, where the index held the same person under\ntwo records (one profile, two ids), so the second copy found the first.\n``already_in_table``: an import into a table that already had rows, where a\nperson found was already one of them (and so was refreshed, not added).",
        "enum": [
          "found_twice",
          "already_in_table"
        ],
        "title": "NotAddedReason",
        "type": "string"
      },
      "NotFoundResponse": {
        "properties": {
          "detail": {
            "description": "The detail of why the resource was not found.",
            "title": "Detail",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "title": "NotFoundResponse",
        "type": "object"
      },
      "NotificationChannel": {
        "description": "Where a notification goes. Slack is a shared channel; email is one person.",
        "enum": [
          "slack",
          "email"
        ],
        "title": "NotificationChannel",
        "type": "string"
      },
      "NotificationKind": {
        "description": "Everything the product can tell a human about.\n\nTHREAD_LABELED is the only kind that carries a label. The rest\nare workspace events with no label dimension, which is why the rule table\nconstrains ``label_id`` to exactly this kind.\n\nThe three credit kinds are stored separately even though the settings UI\noffers one \"credit alerts\" switch: they crossed three different thresholds\nand keeping them apart means splitting the switch later is a UI change, not\na migration.\n\nThe ``affiliate_*`` kinds are program mail to the enrolled affiliate's\ncontact address, not workspace-member fan-out: they carry no preference\nswitch, and the settings grid on the dashboard skips them by prefix.\n\nSEARCH_MATCHES_WAITING: a scheduled lead search no longer buys\nits rows, so when it fires and finds new matches the buy waits on a person\nas a proposal, and this is how they hear about it.",
        "enum": [
          "new_reply",
          "thread_labeled",
          "mailbox_disconnected",
          "low_credits",
          "credits_exhausted",
          "work_paused",
          "draft_awaiting_approval",
          "linkedin_checkpoint",
          "linkedin_browser_offline",
          "search_matches_waiting",
          "contact_asked_to_stop",
          "unread_reply",
          "reply_needs_answer",
          "replies_now_wait",
          "affiliate_welcome",
          "affiliate_referral_signed_up",
          "affiliate_referral_converted",
          "affiliate_statement",
          "affiliate_payout_sent",
          "affiliate_action_needed",
          "affiliate_balance_forfeited"
        ],
        "title": "NotificationKind",
        "type": "string"
      },
      "NotificationPreferenceSchema": {
        "properties": {
          "email_enabled": {
            "title": "Email Enabled",
            "type": "boolean"
          },
          "notification_kind": {
            "$ref": "#/components/schemas/NotificationKind"
          }
        },
        "required": [
          "notification_kind",
          "email_enabled"
        ],
        "title": "NotificationPreferenceSchema",
        "type": "object"
      },
      "NotificationPreferencesPutSchema": {
        "properties": {
          "preferences": {
            "items": {
              "$ref": "#/components/schemas/NotificationPreferenceSchema"
            },
            "maxItems": 20,
            "title": "Preferences",
            "type": "array"
          }
        },
        "required": [
          "preferences"
        ],
        "title": "NotificationPreferencesPutSchema",
        "type": "object"
      },
      "NotificationPreferencesSetSchema": {
        "description": "One user's switches, the whole set: a kind with no stored row shows as on.",
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/NotificationPreferenceSchema"
            },
            "title": "Data",
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "title": "NotificationPreferencesSetSchema",
        "type": "object"
      },
      "NotificationRuleCreateSchema": {
        "properties": {
          "channel": {
            "$ref": "#/components/schemas/NotificationChannel"
          },
          "label_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Label Id"
          },
          "notify_user_id": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Notify User Id"
          },
          "slack_channel_id": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slack Channel Id"
          },
          "trigger_kind": {
            "$ref": "#/components/schemas/NotificationKind"
          }
        },
        "required": [
          "trigger_kind",
          "channel"
        ],
        "title": "NotificationRuleCreateSchema",
        "type": "object"
      },
      "NotificationRuleReadSchema": {
        "properties": {
          "channel": {
            "$ref": "#/components/schemas/NotificationChannel"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_active": {
            "title": "Is Active",
            "type": "boolean"
          },
          "label_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Label Id"
          },
          "notify_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Notify User Id"
          },
          "slack_channel_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slack Channel Id"
          },
          "slack_channel_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slack Channel Name"
          },
          "trigger_kind": {
            "$ref": "#/components/schemas/NotificationKind"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "trigger_kind",
          "label_id",
          "channel",
          "slack_channel_id",
          "slack_channel_name",
          "notify_user_id",
          "is_active",
          "created_at",
          "updated_at"
        ],
        "title": "NotificationRuleReadSchema",
        "type": "object"
      },
      "OnScreenDraftSchema": {
        "additionalProperties": false,
        "description": "Words in an open box on the page: a reply, a task's message, an agent's form.",
        "properties": {
          "id": {
            "anyOf": [
              {
                "pattern": "^[\\w-]{1,64}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Id"
          },
          "kind": {
            "description": "\"reply\", \"task_message\", \"agent\", \"sender_settings\"\u2026",
            "pattern": "^[a-z][a-z_ ]{0,63}$",
            "title": "Kind",
            "type": "string"
          },
          "text": {
            "anyOf": [
              {
                "maxLength": 8000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Text"
          },
          "unsaved": {
            "default": false,
            "description": "Whether the box holds words not yet saved.",
            "title": "Unsaved",
            "type": "boolean"
          }
        },
        "required": [
          "kind"
        ],
        "title": "OnScreenDraftSchema",
        "type": "object"
      },
      "OnScreenKind": {
        "description": "Which shape of page state a message's ``on_screen`` holds: the page it was read off.\n\nA closed set, because each kind has a reader in the dashboard\n(``components/assistant/onScreen/``) and a renderer here\n(``on_screen.py``): a new one is added in both, in one change.",
        "enum": [
          "lead_search",
          "table",
          "table_list",
          "trash",
          "sequence_list",
          "sequence_audience",
          "sequence_writing",
          "sequence_builder",
          "sequence_analytics",
          "sequence_settings",
          "agent_list",
          "agent_editor",
          "agent_preview",
          "sender_list",
          "mailbox_list",
          "sender_activity",
          "sender_settings",
          "sender_mailboxes",
          "sender_linkedin",
          "mailbox_detail",
          "inbox",
          "tasks",
          "usage",
          "do_not_contact",
          "subdomain_search",
          "lead_finders",
          "integration_directory",
          "integration_wizard",
          "business_context",
          "cooldown",
          "notification_settings",
          "assistant_settings",
          "connections",
          "referrals",
          "api_keys",
          "billing",
          "credit_calculator",
          "design_partner",
          "superadmin"
        ],
        "title": "OnScreenKind",
        "type": "string"
      },
      "OnScreenOpenSchema": {
        "additionalProperties": false,
        "description": "One thing open on the page: what \"this\" means.",
        "properties": {
          "id": {
            "pattern": "^[\\w-]{1,64}$",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "description": "\"row\", \"cell\", \"column\", \"contact\", \"task\"\u2026",
            "pattern": "^[a-z][a-z_ ]{0,63}$",
            "title": "Kind",
            "type": "string"
          },
          "label": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Label"
          },
          "parent_id": {
            "anyOf": [
              {
                "pattern": "^[\\w-]{1,64}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What it sits in, when its id alone does not say: a cell's row.",
            "title": "Parent Id"
          }
        },
        "required": [
          "kind",
          "id"
        ],
        "title": "OnScreenOpenSchema",
        "type": "object"
      },
      "OnScreenRangeSchema": {
        "additionalProperties": false,
        "description": "The dates a page reads over: a preset, or the first and last day.",
        "properties": {
          "from": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "From"
          },
          "preset": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Preset"
          },
          "to": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "To"
          }
        },
        "title": "OnScreenRangeSchema",
        "type": "object"
      },
      "OnScreenSchema": {
        "additionalProperties": false,
        "description": "What the page shows beyond its address and names, so a change starts from it.\n\nEvery part optional: a page sends what it has. The filters are in the\nvocabulary of the tool ``filters_as`` names, so the model can call that\ntool with them changed by exactly what was asked. Kept with the message,\nso bounded as a whole (``ON_SCREEN_MAX_BYTES``) as well as part by part.",
        "properties": {
          "draft": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OnScreenDraftSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "extra": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Small facts only this kind of page keeps.",
            "title": "Extra"
          },
          "filters": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "The page's filters, in the vocabulary `filters_as` names.",
            "title": "Filters"
          },
          "filters_as": {
            "anyOf": [
              {
                "pattern": "^[a-z][a-z0-9_]{0,63}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The tool whose arguments the filters are spelled as, e.g. `find_people`.",
            "title": "Filters As"
          },
          "kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OnScreenKind"
              },
              {
                "type": "null"
              }
            ]
          },
          "limit": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "A finder's row limit.",
            "title": "Limit"
          },
          "open": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/OnScreenOpenSchema"
                },
                "maxItems": 4,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open"
          },
          "range": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OnScreenRangeSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "search": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the page's search box holds.",
            "title": "Search"
          },
          "selection": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OnScreenSelectionSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "sort": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/OnScreenSortSchema"
                },
                "maxItems": 8,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sort"
          },
          "view": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OnScreenViewSchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "title": "OnScreenSchema",
        "type": "object"
      },
      "OnScreenSelectionSchema": {
        "additionalProperties": false,
        "description": "What the person ticked on the page: what \"these\" and \"the selected\" mean.",
        "properties": {
          "all_matching": {
            "default": false,
            "description": "Whether every row the page's filter matches is ticked, less `excluded_ids`.",
            "title": "All Matching",
            "type": "boolean"
          },
          "count": {
            "default": 0,
            "description": "How many are ticked, which may be more than `ids` lists.",
            "minimum": 0.0,
            "title": "Count",
            "type": "integer"
          },
          "excluded_ids": {
            "items": {
              "pattern": "^[\\w-]{1,64}$",
              "type": "string"
            },
            "maxItems": 100,
            "title": "Excluded Ids",
            "type": "array"
          },
          "ids": {
            "items": {
              "pattern": "^[\\w-]{1,64}$",
              "type": "string"
            },
            "maxItems": 100,
            "title": "Ids",
            "type": "array"
          },
          "of": {
            "description": "What the ids are of: \"row\", \"contact\", \"thread\".",
            "pattern": "^[a-z][a-z_ ]{0,63}$",
            "title": "Of",
            "type": "string"
          }
        },
        "required": [
          "of"
        ],
        "title": "OnScreenSelectionSchema",
        "type": "object"
      },
      "OnScreenSortSchema": {
        "additionalProperties": false,
        "description": "One level of the order a page shows its rows in.",
        "properties": {
          "direction": {
            "enum": [
              "asc",
              "desc"
            ],
            "title": "Direction",
            "type": "string"
          },
          "field": {
            "maxLength": 255,
            "title": "Field",
            "type": "string"
          }
        },
        "required": [
          "field",
          "direction"
        ],
        "title": "OnScreenSortSchema",
        "type": "object"
      },
      "OnScreenViewSchema": {
        "additionalProperties": false,
        "description": "The saved view or tab a page shows.",
        "properties": {
          "id": {
            "anyOf": [
              {
                "pattern": "^[\\w-]{1,64}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Id"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "unsaved_changes": {
            "default": false,
            "description": "Whether the person changed the view without saving it.",
            "title": "Unsaved Changes",
            "type": "boolean"
          }
        },
        "title": "OnScreenViewSchema",
        "type": "object"
      },
      "OnboardingItemReadSchema": {
        "properties": {
          "completed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "sort_order": {
            "title": "Sort Order",
            "type": "integer"
          },
          "step_key": {
            "$ref": "#/components/schemas/OnboardingStepKey"
          }
        },
        "required": [
          "id",
          "step_key",
          "sort_order",
          "completed_at"
        ],
        "title": "OnboardingItemReadSchema",
        "type": "object"
      },
      "OnboardingReadSchema": {
        "properties": {
          "completed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the last step was completed; null while any step is pending.",
            "title": "Completed At"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "dismissed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When someone hid the checklist for the workspace; null while it shows.",
            "title": "Dismissed At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "items": {
            "description": "The steps, in checklist order.",
            "items": {
              "$ref": "#/components/schemas/OnboardingItemReadSchema"
            },
            "title": "Items",
            "type": "array"
          },
          "targets": {
            "$ref": "#/components/schemas/OnboardingTargetsReadSchema"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "completed_at",
          "dismissed_at",
          "items",
          "targets",
          "created_at",
          "updated_at"
        ],
        "title": "OnboardingReadSchema",
        "type": "object"
      },
      "OnboardingStepKey": {
        "description": "The six steps a new workspace is walked through, named by outcome.\n\nStored as a plain string column, so a seventh step is a new member here\nplus a row the next read seeds: no enum migration, no backfill.",
        "enum": [
          "find_leads",
          "add_enrichment",
          "add_ai_column",
          "connect_mailbox",
          "connect_linkedin",
          "launch_sequence"
        ],
        "title": "OnboardingStepKey",
        "type": "string"
      },
      "OnboardingTargetsReadSchema": {
        "description": "Where the pending steps deep-link; every field is null once the checklist is done.",
        "properties": {
          "draft_sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A draft sequence waiting to be launched; null when there is none.",
            "title": "Draft Sequence Id"
          },
          "latest_table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The newest table, for the add-column steps; null when there is none yet.",
            "title": "Latest Table Id"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender whose LinkedIn tab the connect step opens: one that already sends email when there is one; null when the workspace has no sender.",
            "title": "Sender Profile Id"
          }
        },
        "required": [
          "latest_table_id",
          "sender_profile_id",
          "draft_sequence_id"
        ],
        "title": "OnboardingTargetsReadSchema",
        "type": "object"
      },
      "OnboardingUpdateSchema": {
        "description": "The change a person makes to the checklist: hiding it for the workspace.",
        "properties": {
          "dismissed": {
            "const": true,
            "description": "Send true to hide the checklist for the whole workspace. Hiding is one way: nothing shows the sidebar widget again.",
            "title": "Dismissed",
            "type": "boolean"
          }
        },
        "required": [
          "dismissed"
        ],
        "title": "OnboardingUpdateSchema",
        "type": "object"
      },
      "OrderingParametersForActivityAtLineQueuedAtId": {
        "enum": [
          "activity_at",
          "line",
          "queued_at",
          "id"
        ],
        "title": "OrderingParametersForActivityAtLineQueuedAtId",
        "type": "string"
      },
      "OrderingParametersForAt": {
        "enum": [
          "at"
        ],
        "title": "OrderingParametersForAt",
        "type": "string"
      },
      "OrderingParametersForCheckedAt": {
        "enum": [
          "checked_at"
        ],
        "title": "OrderingParametersForCheckedAt",
        "type": "string"
      },
      "OrderingParametersForCreatedAt": {
        "enum": [
          "created_at"
        ],
        "title": "OrderingParametersForCreatedAt",
        "type": "string"
      },
      "OrderingParametersForCreatedAtContactLabel": {
        "enum": [
          "created_at",
          "contact_label"
        ],
        "title": "OrderingParametersForCreatedAtContactLabel",
        "type": "string"
      },
      "OrderingParametersForCreatedAtDueAtStatus": {
        "enum": [
          "created_at",
          "due_at",
          "status"
        ],
        "title": "OrderingParametersForCreatedAtDueAtStatus",
        "type": "string"
      },
      "OrderingParametersForCreatedAtIdUpdatedAt": {
        "enum": [
          "created_at",
          "id",
          "updated_at"
        ],
        "title": "OrderingParametersForCreatedAtIdUpdatedAt",
        "type": "string"
      },
      "OrderingParametersForCreatedAtUpdatedAt": {
        "enum": [
          "created_at",
          "updated_at"
        ],
        "title": "OrderingParametersForCreatedAtUpdatedAt",
        "type": "string"
      },
      "OrderingParametersForCreditsSpent": {
        "enum": [
          "credits_spent"
        ],
        "title": "OrderingParametersForCreditsSpent",
        "type": "string"
      },
      "OrderingParametersForDomainName": {
        "enum": [
          "domain_name"
        ],
        "title": "OrderingParametersForDomainName",
        "type": "string"
      },
      "OrderingParametersForFirstChargeAt": {
        "enum": [
          "first_charge_at"
        ],
        "title": "OrderingParametersForFirstChargeAt",
        "type": "string"
      },
      "OrderingParametersForFromKey": {
        "enum": [
          "from_key"
        ],
        "title": "OrderingParametersForFromKey",
        "type": "string"
      },
      "OrderingParametersForId": {
        "enum": [
          "id"
        ],
        "title": "OrderingParametersForId",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAt": {
        "enum": [
          "id",
          "created_at"
        ],
        "title": "OrderingParametersForIdCreatedAt",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtName": {
        "enum": [
          "id",
          "created_at",
          "name"
        ],
        "title": "OrderingParametersForIdCreatedAtName",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtPeriod": {
        "enum": [
          "id",
          "created_at",
          "period"
        ],
        "title": "OrderingParametersForIdCreatedAtPeriod",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtStartedAt": {
        "enum": [
          "id",
          "created_at",
          "started_at"
        ],
        "title": "OrderingParametersForIdCreatedAtStartedAt",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtUpdatedAt": {
        "enum": [
          "id",
          "created_at",
          "updated_at"
        ],
        "title": "OrderingParametersForIdCreatedAtUpdatedAt",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtUpdatedAtDeletedAtName": {
        "enum": [
          "id",
          "created_at",
          "updated_at",
          "deleted_at",
          "name"
        ],
        "title": "OrderingParametersForIdCreatedAtUpdatedAtDeletedAtName",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtUpdatedAtEmailAddressProviderConnectionStatusSenderProfileId": {
        "enum": [
          "id",
          "created_at",
          "updated_at",
          "email_address",
          "provider",
          "connection_status",
          "sender_profile_id"
        ],
        "title": "OrderingParametersForIdCreatedAtUpdatedAtEmailAddressProviderConnectionStatusSenderProfileId",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtUpdatedAtName": {
        "enum": [
          "id",
          "created_at",
          "updated_at",
          "name"
        ],
        "title": "OrderingParametersForIdCreatedAtUpdatedAtName",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtUpdatedAtNameCreatedByDisplayName": {
        "enum": [
          "id",
          "created_at",
          "updated_at",
          "name",
          "created_by_display_name"
        ],
        "title": "OrderingParametersForIdCreatedAtUpdatedAtNameCreatedByDisplayName",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtUpdatedAtNameOwnerUserIdLastViewedAt": {
        "enum": [
          "id",
          "created_at",
          "updated_at",
          "name",
          "owner_user_id",
          "last_viewed_at"
        ],
        "title": "OrderingParametersForIdCreatedAtUpdatedAtNameOwnerUserIdLastViewedAt",
        "type": "string"
      },
      "OrderingParametersForIdCreatedAtValue": {
        "enum": [
          "id",
          "created_at",
          "value"
        ],
        "title": "OrderingParametersForIdCreatedAtValue",
        "type": "string"
      },
      "OrderingParametersForIdName": {
        "enum": [
          "id",
          "name"
        ],
        "title": "OrderingParametersForIdName",
        "type": "string"
      },
      "OrderingParametersForIdOccurredAtCreatedAt": {
        "enum": [
          "id",
          "occurred_at",
          "created_at"
        ],
        "title": "OrderingParametersForIdOccurredAtCreatedAt",
        "type": "string"
      },
      "OrderingParametersForIdOccurredAtCreatedAtUpdatedAt": {
        "enum": [
          "id",
          "occurred_at",
          "created_at",
          "updated_at"
        ],
        "title": "OrderingParametersForIdOccurredAtCreatedAtUpdatedAt",
        "type": "string"
      },
      "OrderingParametersForIdRanAt": {
        "enum": [
          "id",
          "ran_at"
        ],
        "title": "OrderingParametersForIdRanAt",
        "type": "string"
      },
      "OrderingParametersForIdSignedUpAt": {
        "enum": [
          "id",
          "signed_up_at"
        ],
        "title": "OrderingParametersForIdSignedUpAt",
        "type": "string"
      },
      "OrderingParametersForIdSignedUpAtCreatedAt": {
        "enum": [
          "id",
          "signed_up_at",
          "created_at"
        ],
        "title": "OrderingParametersForIdSignedUpAtCreatedAt",
        "type": "string"
      },
      "OrderingParametersForIdStartedAt": {
        "enum": [
          "id",
          "started_at"
        ],
        "title": "OrderingParametersForIdStartedAt",
        "type": "string"
      },
      "OrderingParametersForLastMessageAt": {
        "enum": [
          "last_message_at"
        ],
        "title": "OrderingParametersForLastMessageAt",
        "type": "string"
      },
      "OrderingParametersForLastTouchAtNameEmployeeCountPeopleCountNewestRowAt": {
        "enum": [
          "last_touch_at",
          "name",
          "employee_count",
          "people_count",
          "newest_row_at"
        ],
        "title": "OrderingParametersForLastTouchAtNameEmployeeCountPeopleCountNewestRowAt",
        "type": "string"
      },
      "OrderingParametersForLastUsedAtCreatedAtName": {
        "enum": [
          "last_used_at",
          "created_at",
          "name"
        ],
        "title": "OrderingParametersForLastUsedAtCreatedAtName",
        "type": "string"
      },
      "OrderingParametersForListedAt": {
        "enum": [
          "listed_at"
        ],
        "title": "OrderingParametersForListedAt",
        "type": "string"
      },
      "OrderingParametersForName": {
        "enum": [
          "name"
        ],
        "title": "OrderingParametersForName",
        "type": "string"
      },
      "OrderingParametersForNameCreatedAtUpdatedAtId": {
        "enum": [
          "name",
          "created_at",
          "updated_at",
          "id"
        ],
        "title": "OrderingParametersForNameCreatedAtUpdatedAtId",
        "type": "string"
      },
      "OrderingParametersForNameId": {
        "enum": [
          "name",
          "id"
        ],
        "title": "OrderingParametersForNameId",
        "type": "string"
      },
      "OrderingParametersForNameIdCreatedAtUpdatedAt": {
        "enum": [
          "name",
          "id",
          "created_at",
          "updated_at"
        ],
        "title": "OrderingParametersForNameIdCreatedAtUpdatedAt",
        "type": "string"
      },
      "OrderingParametersForNameTitleSeniorityDepartmentLastContactedAt": {
        "enum": [
          "name",
          "title",
          "seniority",
          "department",
          "last_contacted_at"
        ],
        "title": "OrderingParametersForNameTitleSeniorityDepartmentLastContactedAt",
        "type": "string"
      },
      "OrderingParametersForNumber": {
        "enum": [
          "number"
        ],
        "title": "OrderingParametersForNumber",
        "type": "string"
      },
      "OrderingParametersForOccurredAt": {
        "enum": [
          "occurred_at"
        ],
        "title": "OrderingParametersForOccurredAt",
        "type": "string"
      },
      "OrderingParametersForOccurredAtContactLabel": {
        "enum": [
          "occurred_at",
          "contact_label"
        ],
        "title": "OrderingParametersForOccurredAtContactLabel",
        "type": "string"
      },
      "OrderingParametersForPosition": {
        "enum": [
          "position"
        ],
        "title": "OrderingParametersForPosition",
        "type": "string"
      },
      "OrderingParametersForPositionIdCreatedAtUpdatedAt": {
        "enum": [
          "position",
          "id",
          "created_at",
          "updated_at"
        ],
        "title": "OrderingParametersForPositionIdCreatedAtUpdatedAt",
        "type": "string"
      },
      "OrderingParametersForProposedAt": {
        "enum": [
          "proposed_at"
        ],
        "title": "OrderingParametersForProposedAt",
        "type": "string"
      },
      "OrderingParametersForSentAtId": {
        "enum": [
          "sent_at",
          "id"
        ],
        "title": "OrderingParametersForSentAtId",
        "type": "string"
      },
      "OrderingParametersForSequence": {
        "enum": [
          "sequence"
        ],
        "title": "OrderingParametersForSequence",
        "type": "string"
      },
      "OrderingParametersForTableName": {
        "enum": [
          "table_name"
        ],
        "title": "OrderingParametersForTableName",
        "type": "string"
      },
      "OutboundAgentConfig": {
        "additionalProperties": false,
        "description": "The versioned configuration one outbound agent carries, stored as JSON on its row.\n\nEverything a person sets on the Agent tab that is not already a column of\nthe saved-agent row (``model_key`` and the research switch live there).\n``message_prompts`` is keyed by an opaque slot key the caller mints (the\nstep id); the agent never learns what a slot means.",
        "properties": {
          "campaign": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CampaignBrief"
              },
              {
                "type": "null"
              }
            ]
          },
          "cta_label": {
            "anyOf": [
              {
                "maxLength": 200,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cta Label"
          },
          "cta_url": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cta Url"
          },
          "goal": {
            "default": "",
            "maxLength": 1000,
            "title": "Goal",
            "type": "string"
          },
          "language": {
            "default": "English",
            "maxLength": 16,
            "title": "Language",
            "type": "string"
          },
          "message_prompts": {
            "additionalProperties": {
              "maxLength": 4000,
              "type": "string"
            },
            "maxProperties": 50,
            "propertyNames": {
              "maxLength": 64
            },
            "title": "Message Prompts",
            "type": "object"
          },
          "person_research": {
            "default": false,
            "title": "Person Research",
            "type": "boolean"
          },
          "reply_drafting": {
            "default": true,
            "title": "Reply Drafting",
            "type": "boolean"
          },
          "reply_labels": {
            "default": [
              "positive"
            ],
            "items": {
              "$ref": "#/components/schemas/ReplyLabel"
            },
            "maxItems": 8,
            "title": "Reply Labels",
            "type": "array"
          },
          "reply_prompt": {
            "default": "",
            "maxLength": 4000,
            "title": "Reply Prompt",
            "type": "string"
          },
          "translate": {
            "default": false,
            "title": "Translate",
            "type": "boolean"
          },
          "write_from_excluded_column_ids": {
            "items": {
              "maxLength": 64,
              "type": "string"
            },
            "maxItems": 200,
            "title": "Write From Excluded Column Ids",
            "type": "array"
          }
        },
        "title": "OutboundAgentConfig",
        "type": "object"
      },
      "OutboundAgentReadSchema": {
        "description": "One sequence's outbound agent: what it writes with, and how.",
        "properties": {
          "column_names": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "The audience column each column id in the configuration is, by name: the columns the goal and the prompts point at with /, and the ones taken out of Write from. Filled on a read; a column that is gone is missing from it.",
            "title": "Column Names",
            "type": "object"
          },
          "config": {
            "$ref": "#/components/schemas/OutboundAgentConfig"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "model_key": {
            "title": "Model Key",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "research": {
            "title": "Research",
            "type": "boolean"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "version": {
            "title": "Version",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "name",
          "version",
          "model_key",
          "research",
          "config",
          "created_at",
          "updated_at"
        ],
        "title": "OutboundAgentReadSchema",
        "type": "object"
      },
      "OutboundAgentUpdateSchema": {
        "description": "A change to an agent, sent whole against the version it was read at.\n\nThe configuration travels as one object rather than as fifteen optional\nfields: the AI writing tab reads the agent, edits it and sends it back, and\n``expected_version`` makes two people editing at once a 409 rather than a\nsilent overwrite.",
        "properties": {
          "config": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OutboundAgentConfig"
              },
              {
                "type": "null"
              }
            ],
            "description": "The whole configuration; omitted leaves it as it is. Its `campaign` is ignored: a legacy brief, read only, that nothing writes any more."
          },
          "expected_version": {
            "description": "The version the editor was opened at.",
            "minimum": 1.0,
            "title": "Expected Version",
            "type": "integer"
          },
          "model_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model it writes with: swift, core or deep.",
            "title": "Model Key"
          },
          "research": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the first message may research the person on the web.",
            "title": "Research"
          }
        },
        "required": [
          "expected_version"
        ],
        "title": "OutboundAgentUpdateSchema",
        "type": "object"
      },
      "OutboundAgentVersionReadSchema": {
        "description": "One entry of an agent's version history.",
        "properties": {
          "changed_fields": {
            "items": {
              "type": "string"
            },
            "title": "Changed Fields",
            "type": "array"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created By User Id"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/SavedAgentVersionSource"
          },
          "version": {
            "title": "Version",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "version",
          "source",
          "created_by_user_id",
          "created_at"
        ],
        "title": "OutboundAgentVersionReadSchema",
        "type": "object"
      },
      "OutboundCampaignReadSchema": {
        "description": "One campaign from the library a new sequence starts from.",
        "properties": {
          "icon": {
            "description": "The Lucide token its card wears on the Sequences page.",
            "title": "Icon",
            "type": "string"
          },
          "key": {
            "title": "Key",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/OutboundCampaignStepReadSchema"
            },
            "title": "Steps",
            "type": "array"
          },
          "summary": {
            "title": "Summary",
            "type": "string"
          },
          "tagline": {
            "description": "The summary in a few words, for a card's two lines.",
            "title": "Tagline",
            "type": "string"
          }
        },
        "required": [
          "key",
          "name",
          "summary",
          "tagline",
          "icon",
          "steps"
        ],
        "title": "OutboundCampaignReadSchema",
        "type": "object"
      },
      "OutboundCampaignStepReadSchema": {
        "description": "One step of a library campaign.",
        "properties": {
          "arm": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`connected` or `not_accepted`: the answer to the campaign's connection request this step waits for. Null before the request, and on a step laid out on both branches.",
            "title": "Arm"
          },
          "kind": {
            "description": "`email`, `linkedin_connection` or `linkedin_withdraw`.",
            "title": "Kind",
            "type": "string"
          },
          "prompt": {
            "description": "The instruction the step's message is written from; empty on a withdraw.",
            "title": "Prompt",
            "type": "string"
          },
          "title": {
            "description": "What the step's card is called.",
            "title": "Title",
            "type": "string"
          },
          "wait_days": {
            "description": "Days to wait before this step; 0 on the first.",
            "title": "Wait Days",
            "type": "integer"
          },
          "window_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a connection request: how many days it waits for an answer before the contact goes down Not accepted. Null on every other step.",
            "title": "Window Days"
          }
        },
        "required": [
          "kind",
          "title",
          "wait_days",
          "prompt"
        ],
        "title": "OutboundCampaignStepReadSchema",
        "type": "object"
      },
      "OutboundConversationReadSchema": {
        "description": "One contact's running conversation with the agent, and what it has written.",
        "properties": {
          "company_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Key"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_turn_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Turn At"
          },
          "messages": {
            "items": {
              "$ref": "#/components/schemas/OutboundMessageReadSchema"
            },
            "title": "Messages",
            "type": "array"
          },
          "profile": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OutboundProfileReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's LinkedIn profile as person research kept it, when it read one."
          },
          "profile_read_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the profile was read; null until an opener read one.",
            "title": "Profile Read At"
          },
          "research_brief": {
            "items": {
              "$ref": "#/components/schemas/OutboundResearchFactReadSchema"
            },
            "title": "Research Brief",
            "type": "array"
          },
          "researched_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Researched At"
          },
          "sources": {
            "items": {
              "type": "string"
            },
            "title": "Sources",
            "type": "array"
          },
          "subject_key": {
            "title": "Subject Key",
            "type": "string"
          }
        },
        "required": [
          "id",
          "subject_key",
          "company_key",
          "research_brief",
          "sources",
          "researched_at",
          "last_turn_at",
          "messages"
        ],
        "title": "OutboundConversationReadSchema",
        "type": "object"
      },
      "OutboundDefaultsReadSchema": {
        "description": "What a new outbound agent starts with, and whether person research can be switched on.",
        "properties": {
          "default_config": {
            "$ref": "#/components/schemas/OutboundAgentConfig"
          },
          "default_email_prompts": {
            "items": {
              "type": "string"
            },
            "title": "Default Email Prompts",
            "type": "array"
          },
          "default_linkedin_prompts": {
            "additionalProperties": {
              "type": "string"
            },
            "title": "Default Linkedin Prompts",
            "type": "object"
          },
          "default_reply_prompt": {
            "title": "Default Reply Prompt",
            "type": "string"
          },
          "person_research_available": {
            "default": false,
            "description": "Whether person research can be switched on: the catalog offers the read.",
            "title": "Person Research Available",
            "type": "boolean"
          }
        },
        "required": [
          "default_config",
          "default_email_prompts",
          "default_linkedin_prompts",
          "default_reply_prompt"
        ],
        "title": "OutboundDefaultsReadSchema",
        "type": "object"
      },
      "OutboundFeedbackCreateSchema": {
        "description": "A thumb, a note, or both, on one message the agent wrote.",
        "properties": {
          "body": {
            "default": "",
            "description": "The words rated, when the message they were on is gone.",
            "maxLength": 20000,
            "title": "Body",
            "type": "string"
          },
          "comment": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the person wants changed.",
            "title": "Comment"
          },
          "create_only": {
            "default": false,
            "description": "Refuse to replace an existing verdict that was not reviewed.",
            "title": "Create Only",
            "type": "boolean"
          },
          "edited_body": {
            "anyOf": [
              {
                "maxLength": 20000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Edited Body"
          },
          "edited_subject": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Edited Subject"
          },
          "kind": {
            "$ref": "#/components/schemas/MessageKind",
            "default": "email",
            "description": "What the message was; read from the message itself when one is named."
          },
          "message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The message being rated; null when it is already gone.",
            "title": "Message Id"
          },
          "rating": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FeedbackRating"
              },
              {
                "type": "null"
              }
            ],
            "description": "The thumb."
          },
          "source": {
            "default": "agent_tab",
            "description": "Where the verdict was given: a sequence's AI writing tab and its Preview (`agent_tab`), or a task waiting for approval (`approval_card`). Only a verdict given on the AI writing tab counts as a review of that step's writing.",
            "enum": [
              "agent_tab",
              "approval_card"
            ],
            "title": "Source",
            "type": "string"
          }
        },
        "title": "OutboundFeedbackCreateSchema",
        "type": "object"
      },
      "OutboundFeedbackReadSchema": {
        "description": "One person's verdict on one message the agent wrote.",
        "properties": {
          "comment": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Comment"
          },
          "consumed_in_version": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Consumed In Version"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "edited_body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Edited Body"
          },
          "edited_subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Edited Subject"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/MessageKind"
          },
          "message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message Id"
          },
          "original_body": {
            "title": "Original Body",
            "type": "string"
          },
          "original_subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Original Subject"
          },
          "rating": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FeedbackRating"
              },
              {
                "type": "null"
              }
            ]
          },
          "slot_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slot Key"
          },
          "source": {
            "$ref": "#/components/schemas/FeedbackSource"
          },
          "teaches": {
            "description": "Whether it says something needs work: a thumbs down, a note given without a Looks good, or a rewrite. A Looks good with no rewrite, a note on it and an approval kept as written included, does not. Either way it is a record: the agent learns only from Needs work, through its learnings.",
            "title": "Teaches",
            "type": "boolean"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "user_id": {
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "message_id",
          "kind",
          "slot_key",
          "user_id",
          "rating",
          "comment",
          "original_subject",
          "original_body",
          "edited_subject",
          "edited_body",
          "source",
          "consumed_in_version",
          "teaches",
          "created_at",
          "updated_at"
        ],
        "title": "OutboundFeedbackReadSchema",
        "type": "object"
      },
      "OutboundFeedbackUpdateSchema": {
        "description": "The complete replacement verdict, tied to the feedback the author reviewed.",
        "properties": {
          "comment": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Comment"
          },
          "edited_body": {
            "anyOf": [
              {
                "maxLength": 20000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Edited Body"
          },
          "edited_subject": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Edited Subject"
          },
          "expected_updated_at": {
            "format": "date-time",
            "title": "Expected Updated At",
            "type": "string"
          },
          "rating": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FeedbackRating"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "expected_updated_at",
          "rating",
          "comment",
          "edited_subject",
          "edited_body"
        ],
        "title": "OutboundFeedbackUpdateSchema",
        "type": "object"
      },
      "OutboundFindingReadSchema": {
        "description": "One thing a check said about a written message.",
        "properties": {
          "code": {
            "title": "Code",
            "type": "string"
          },
          "excerpt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Excerpt"
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "severity": {
            "title": "Severity",
            "type": "string"
          }
        },
        "required": [
          "code",
          "severity",
          "message",
          "excerpt"
        ],
        "title": "OutboundFindingReadSchema",
        "type": "object"
      },
      "OutboundMessageEditSchema": {
        "description": "A person's replacement words for one written message.",
        "properties": {
          "body": {
            "description": "The body that sends.",
            "maxLength": 20000,
            "minLength": 1,
            "title": "Body",
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The subject; null threads the message under the last one.",
            "title": "Subject"
          }
        },
        "required": [
          "body"
        ],
        "title": "OutboundMessageEditSchema",
        "type": "object"
      },
      "OutboundMessageReadSchema": {
        "description": "One message the agent wrote, with everything shown beside it.",
        "properties": {
          "agent_version": {
            "title": "Agent Version",
            "type": "integer"
          },
          "angle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Angle"
          },
          "body": {
            "title": "Body",
            "type": "string"
          },
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageConfidence"
              },
              {
                "type": "null"
              }
            ]
          },
          "confidence_score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Confidence Score"
          },
          "confident": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Confident"
          },
          "conversation_id": {
            "format": "uuid",
            "title": "Conversation Id",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "credits_charged": {
            "title": "Credits Charged",
            "type": "integer"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "facts_used": {
            "items": {
              "type": "string"
            },
            "title": "Facts Used",
            "type": "array"
          },
          "findings": {
            "items": {
              "$ref": "#/components/schemas/OutboundFindingReadSchema"
            },
            "title": "Findings",
            "type": "array"
          },
          "generated_body": {
            "title": "Generated Body",
            "type": "string"
          },
          "generated_subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Generated Subject"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "insufficient_data": {
            "title": "Insufficient Data",
            "type": "boolean"
          },
          "is_preview": {
            "title": "Is Preview",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/MessageKind"
          },
          "model_key": {
            "title": "Model Key",
            "type": "string"
          },
          "opens_thread": {
            "title": "Opens Thread",
            "type": "boolean"
          },
          "price_tenths": {
            "title": "Price Tenths",
            "type": "integer"
          },
          "profile_read": {
            "default": false,
            "description": "Whether the agent read the contact's LinkedIn profile for this message.",
            "title": "Profile Read",
            "type": "boolean"
          },
          "reach": {
            "$ref": "#/components/schemas/AgentReach"
          },
          "reasoning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reasoning"
          },
          "sent_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sent At"
          },
          "slot_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slot Key"
          },
          "status": {
            "$ref": "#/components/schemas/MessageStatus"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          }
        },
        "required": [
          "id",
          "conversation_id",
          "kind",
          "slot_key",
          "opens_thread",
          "subject",
          "body",
          "generated_subject",
          "generated_body",
          "confidence",
          "confidence_score",
          "confident",
          "reasoning",
          "insufficient_data",
          "findings",
          "facts_used",
          "angle",
          "model_key",
          "reach",
          "price_tenths",
          "credits_charged",
          "status",
          "error",
          "is_preview",
          "agent_version",
          "sent_at",
          "created_at"
        ],
        "title": "OutboundMessageReadSchema",
        "type": "object"
      },
      "OutboundMessageRegenerateReadSchema": {
        "description": "What asking the agent to write a message again set in motion.",
        "properties": {
          "draft_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a reply, the new draft now waiting for approval in the inbox. Null for a cadence message, and null for a reply when the agent found nothing it could usefully say.",
            "title": "Draft Id"
          },
          "kind": {
            "$ref": "#/components/schemas/MessageKind",
            "description": "What the message is. A message in the sequence's cadence is rewritten in the background and appears on the contact's conversation once written; a reply is rewritten straight away as a new draft in the inbox."
          },
          "message_id": {
            "description": "The message the agent was asked to write again.",
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          }
        },
        "required": [
          "message_id",
          "kind",
          "draft_id"
        ],
        "title": "OutboundMessageRegenerateReadSchema",
        "type": "object"
      },
      "OutboundMessageRegenerateSchema": {
        "description": "What to change when the agent writes a message again.",
        "properties": {
          "from_task": {
            "default": false,
            "description": "True when the ask comes from the message's own task in the approval queue. That task reads Writing while the agent writes the message again, then comes back waiting for a person; without it, a message waiting for approval is refused.",
            "title": "From Task",
            "type": "boolean"
          },
          "steer_text": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A note on what to do differently, such as 'shorter' or 'open on their new funding round'. Leave it out to have the agent simply try again; a reply keeps the note its last draft was written with.",
            "title": "Steer Text"
          }
        },
        "title": "OutboundMessageRegenerateSchema",
        "type": "object"
      },
      "OutboundPreviewAllowanceReadSchema": {
        "description": "What is left of the workspace's free preview allowance today.",
        "properties": {
          "limit": {
            "description": "How many preview units the workspace may use per UTC day; 0 is none.",
            "title": "Limit",
            "type": "integer"
          },
          "remaining": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many it may still use today; a preview needing more is refused (a step's preview says what writing it needs in `preview_units`). Null when the count cannot be read right now, and previews are then not refused.",
            "title": "Remaining"
          },
          "resets_at": {
            "description": "When the allowance starts again: midnight UTC.",
            "format": "date-time",
            "title": "Resets At",
            "type": "string"
          },
          "used": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many it has used today, never more than `limit`; null when the count cannot be read right now.",
            "title": "Used"
          }
        },
        "required": [
          "limit",
          "used",
          "remaining",
          "resets_at"
        ],
        "title": "OutboundPreviewAllowanceReadSchema",
        "type": "object"
      },
      "OutboundPricePointReadSchema": {
        "description": "What one model costs per message, in tenths of a credit.",
        "properties": {
          "clock_seconds": {
            "title": "Clock Seconds",
            "type": "number"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "model_key": {
            "title": "Model Key",
            "type": "string"
          },
          "no_web_tenths": {
            "title": "No Web Tenths",
            "type": "integer"
          },
          "profile_tenths": {
            "description": "What reading a contact's LinkedIn profile adds to the first message on this model, in tenths of a credit; charged only when a profile was read.",
            "title": "Profile Tenths",
            "type": "integer"
          },
          "web_tenths": {
            "title": "Web Tenths",
            "type": "integer"
          }
        },
        "required": [
          "model_key",
          "display_name",
          "no_web_tenths",
          "web_tenths",
          "profile_tenths",
          "clock_seconds"
        ],
        "title": "OutboundPricePointReadSchema",
        "type": "object"
      },
      "OutboundProfileReadSchema": {
        "description": "What person research kept of the contact's LinkedIn profile.",
        "properties": {
          "about": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "About"
          },
          "company_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Name"
          },
          "education": {
            "items": {
              "type": "string"
            },
            "title": "Education",
            "type": "array"
          },
          "followers": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Followers"
          },
          "headline": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Headline"
          },
          "job_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Job Title"
          },
          "location": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Location"
          },
          "profile_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Url"
          },
          "work_history": {
            "items": {
              "$ref": "#/components/schemas/OutboundProfileRoleReadSchema"
            },
            "title": "Work History",
            "type": "array"
          }
        },
        "required": [
          "headline",
          "about",
          "job_title",
          "company_name",
          "location",
          "followers",
          "work_history",
          "education",
          "profile_url"
        ],
        "title": "OutboundProfileReadSchema",
        "type": "object"
      },
      "OutboundProfileRoleReadSchema": {
        "description": "One role from the profile's work history.",
        "properties": {
          "employer": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Employer"
          },
          "end": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "End"
          },
          "start": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Start"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          }
        },
        "required": [
          "title",
          "employer",
          "start",
          "end"
        ],
        "title": "OutboundProfileRoleReadSchema",
        "type": "object"
      },
      "OutboundResearchFactReadSchema": {
        "description": "One fact the research kept about the contact.",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/ResearchFactCategory"
          },
          "fact": {
            "title": "Fact",
            "type": "string"
          },
          "source_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Title"
          },
          "source_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Url"
          }
        },
        "required": [
          "fact",
          "category",
          "source_url",
          "source_title"
        ],
        "title": "OutboundResearchFactReadSchema",
        "type": "object"
      },
      "OutboundVersionChangesSchema": {
        "properties": {
          "changes": {
            "items": {
              "$ref": "#/components/schemas/OutboundWritingChangeSchema"
            },
            "title": "Changes",
            "type": "array"
          },
          "compared_version": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Compared Version"
          },
          "current_version": {
            "title": "Current Version",
            "type": "integer"
          },
          "version": {
            "title": "Version",
            "type": "integer"
          }
        },
        "required": [
          "version",
          "compared_version",
          "current_version",
          "changes"
        ],
        "title": "OutboundVersionChangesSchema",
        "type": "object"
      },
      "OutboundWritingChangeSchema": {
        "properties": {
          "after": {
            "title": "After"
          },
          "before": {
            "title": "Before"
          },
          "field": {
            "title": "Field",
            "type": "string"
          },
          "label": {
            "title": "Label",
            "type": "string"
          }
        },
        "required": [
          "field",
          "label"
        ],
        "title": "OutboundWritingChangeSchema",
        "type": "object"
      },
      "OutreachAccountsChangedEventSchema": {
        "description": "An account changed; refetch that account's reads and the Accounts list.\n\n``account_key`` None means more than one account changed in the same\ntransaction, and every account read on screen should refetch.",
        "properties": {
          "account_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Account Key"
          }
        },
        "title": "OutreachAccountsChangedEventSchema",
        "type": "object"
      },
      "OutreachActivityChangedEventSchema": {
        "description": "A sender's Activity gained a row; refetch that sender's Activity.\n\n``sender_profile_id`` None means more than one sender's did in the same\ntransaction.",
        "properties": {
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sender Profile Id"
          }
        },
        "title": "OutreachActivityChangedEventSchema",
        "type": "object"
      },
      "OutreachActivityCountSchema": {
        "description": "How many Activity rows the same filters select, for the page's total.",
        "properties": {
          "count": {
            "description": "How many rows match the filters.",
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "OutreachActivityCountSchema",
        "type": "object"
      },
      "OutreachActivityEmailReadSchema": {
        "description": "The email one row of a sender's activity sent, exactly as it left.",
        "properties": {
          "email_html": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The email's HTML part exactly as it was handed to Gmail: the words, the signature and the opt-out footer, every line and space as the contact got them. Null for a LinkedIn row, or a send from before the send kept its email.",
            "title": "Email Html"
          }
        },
        "required": [
          "email_html"
        ],
        "title": "OutreachActivityEmailReadSchema",
        "type": "object"
      },
      "OutreachActivityReadSchema": {
        "description": "One email or LinkedIn step that went out as a sender, or a task a person refused.",
        "properties": {
          "acted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a LinkedIn step acted on LinkedIn. Set on a step marked failed means it went through after all, after it was marked failed.",
            "title": "Acted At"
          },
          "agent_written": {
            "description": "Whether the outbound agent wrote the words.",
            "title": "Agent Written",
            "type": "boolean"
          },
          "ask_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AskReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why it was held for a person before it went; null when it was not held."
          },
          "audience_table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table the sequence reads its audience from, for opening the contact's row; null outside a sequence or when the sequence is gone.",
            "title": "Audience Table Id"
          },
          "background": {
            "description": "Whether this is one of our own LinkedIn reads of the sender's account (the inbox, the sent connection requests, the newest connections, one conversation), which acts on nobody.",
            "title": "Background",
            "type": "boolean"
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The words as they went out, or would have for a refusal; for a Browser use run, the site it worked on.",
            "title": "Body"
          },
          "channel": {
            "$ref": "#/components/schemas/TaskChannel"
          },
          "contact_company": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's company, from their audience row.",
            "title": "Contact Company"
          },
          "contact_identity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The address or LinkedIn profile behind the label.",
            "title": "Contact Identity"
          },
          "contact_label": {
            "description": "The contact as the queue names them: a name, else an address or profile.",
            "title": "Contact Label",
            "type": "string"
          },
          "contact_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's job title, from their audience row.",
            "title": "Contact Title"
          },
          "decided_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Decided At"
          },
          "decided_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who approved it, refused it or sent it: a person's name, an API key's, or the platform's. Null when nobody did.",
            "title": "Decided By Display Name"
          },
          "decision": {
            "$ref": "#/components/schemas/ActivityDecision"
          },
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why it failed, in the channel's words, or why the person refused it; for a Browser use run, why it needed a person or failed.",
            "title": "Detail"
          },
          "enrolment_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's place in the sequence, for opening them on its Audience tab.",
            "title": "Enrolment Id"
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The LinkedIn step's error code, or for a skip its specific reason, for the words every LinkedIn surface gives it.",
            "title": "Error Code"
          },
          "found_already": {
            "default": false,
            "description": "A step that was cut off, came back, and found its own earlier attempt had already done it.",
            "title": "Found Already",
            "type": "boolean"
          },
          "hand_edited": {
            "description": "A person edited the agent's words before they went, so Needs work is refused on them.",
            "title": "Hand Edited",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "description": "The LinkedIn action slug, or `email` (a sequence's email), `reply`, or `browser_use` (a settled Browser use run, on the `browser` channel).",
            "title": "Kind",
            "type": "string"
          },
          "linkedin_action_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Action Id"
          },
          "looks_good": {
            "description": "A person marked the words that went out Looks good (PUT /agent-learnings/sent-messages/{message_id}/looks-good/).",
            "title": "Looks Good",
            "type": "boolean"
          },
          "mailbox_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The address an email left from; null for LinkedIn.",
            "title": "Mailbox Address"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mailbox Id"
          },
          "occurred_at": {
            "description": "When it was sent, when the LinkedIn step ended, or when it was refused.",
            "format": "date-time",
            "title": "Occurred At",
            "type": "string"
          },
          "outbound_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The outbound agent's message whose words went out (or would have, for a refusal): a sequence's email or LinkedIn step, a connection request's note, an approved reply. A thumbs down on what went out is given on it (`message:<id>`), whether or not it had a task. Null when the agent wrote none of the words, and on rows from before it was kept that nothing could fill.",
            "title": "Outbound Message Id"
          },
          "outcome": {
            "$ref": "#/components/schemas/ActivityOutcome"
          },
          "proposed_learning_event_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The feedback session waiting on the words that went out (`outbound_message_id`): notes were given (`message:<id>`) and what they would teach waits for Looks good, which saves it, or Discard feedback, which drops it. The row's 'Unfinished feedback' chip. Read it with GET /agent-learnings/thumbs-downs/{event_id}/. Null when none waits.",
            "title": "Proposed Learning Event Id"
          },
          "record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's row in the sequence's audience table.",
            "title": "Record Id"
          },
          "sender_profile_id": {
            "format": "uuid",
            "title": "Sender Profile Id",
            "type": "string"
          },
          "sender_profile_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender it went out as; null when the sender was since deleted.",
            "title": "Sender Profile Name"
          },
          "sent_without_note": {
            "default": false,
            "description": "A connection request LinkedIn sent the moment Connect was pressed, before its note could be added: the connection request went, the note did not.",
            "title": "Sent Without Note",
            "type": "boolean"
          },
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sequence Id"
          },
          "sequence_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sequence Name"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Id"
          },
          "step_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step as its card in the Builder names it; null outside a sequence.",
            "title": "Step Name"
          },
          "step_position": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Position"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "An email's subject line; for a Browser use run, the outcome it settled on (null for Needs human and a failure).",
            "title": "Subject"
          },
          "task_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Its task on the Tasks page, when it had one.",
            "title": "Task Id"
          },
          "thread_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The inbox conversation, when there is one.",
            "title": "Thread Id"
          }
        },
        "required": [
          "id",
          "sender_profile_id",
          "sender_profile_name",
          "channel",
          "kind",
          "background",
          "occurred_at",
          "outcome",
          "decision",
          "decided_by_display_name",
          "decided_at",
          "ask_reason",
          "agent_written",
          "contact_label",
          "contact_identity",
          "sequence_id",
          "sequence_name",
          "step_id",
          "step_name",
          "step_position",
          "enrolment_id",
          "record_id",
          "audience_table_id",
          "task_id",
          "linkedin_action_id",
          "mailbox_id",
          "mailbox_address",
          "thread_id",
          "outbound_message_id",
          "subject",
          "body",
          "detail",
          "error_code",
          "looks_good",
          "hand_edited"
        ],
        "title": "OutreachActivityReadSchema",
        "type": "object"
      },
      "OutreachActivitySettings": {
        "description": "Settings for the outreach-activity action: which signal to return.",
        "properties": {
          "field": {
            "default": "summary",
            "enum": [
              "summary",
              "in_live_sequence",
              "live_sequences",
              "reply_threads",
              "total_matching_threads",
              "last_reply_at",
              "bounced"
            ],
            "title": "Field",
            "type": "string"
          },
          "kind": {
            "const": "outreach_activity",
            "default": "outreach_activity",
            "title": "Kind",
            "type": "string"
          }
        },
        "title": "OutreachActivitySettings",
        "type": "object"
      },
      "OutreachApprovalScheduleReadSchema": {
        "description": "When the work an approval just let go is expected to run, per channel.",
        "properties": {
          "email_count": {
            "description": "How many approved emails the engine now sends.",
            "title": "Email Count",
            "type": "integer"
          },
          "email_held": {
            "default": 0,
            "description": "How many of the approved emails wait for their paused sequence to be resumed. They go out after Resume sequence, not before.",
            "title": "Email Held",
            "type": "integer"
          },
          "email_starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the approved emails start, if every one of their running sequences' sending windows is closed now: the earliest opening. Null when they go now, or when every one of them waits for a paused sequence.",
            "title": "Email Starts At"
          },
          "linkedin": {
            "description": "One entry per sender whose LinkedIn steps were approved.",
            "items": {
              "$ref": "#/components/schemas/LinkedInApprovalScheduleReadSchema"
            },
            "title": "Linkedin",
            "type": "array"
          }
        },
        "required": [
          "linkedin",
          "email_count",
          "email_starts_at"
        ],
        "title": "OutreachApprovalScheduleReadSchema",
        "type": "object"
      },
      "OutreachChangeKind": {
        "description": "The event kinds the outreach change feed emits.",
        "enum": [
          "hello",
          "tasks_changed",
          "contacts_changed",
          "linkedin_steps_changed",
          "activity_changed",
          "accounts_changed",
          "credits_changed",
          "resync",
          "reconnect"
        ],
        "title": "OutreachChangeKind",
        "type": "string"
      },
      "OutreachContactsChangedEventSchema": {
        "description": "Contacts of a sequence changed; refetch that sequence's reads.\n\n``sequence_id`` None means more than one sequence changed in the same\ntransaction, and every sequence read on screen should refetch.",
        "properties": {
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sequence Id"
          }
        },
        "title": "OutreachContactsChangedEventSchema",
        "type": "object"
      },
      "OutreachCreditsChangedEventSchema": {
        "description": "The workspace's credit balance moved; refetch the balance the app bar shows.",
        "properties": {},
        "title": "OutreachCreditsChangedEventSchema",
        "type": "object"
      },
      "OutreachHelloEventSchema": {
        "description": "Sent first on every connection; the client refetches what it shows.",
        "properties": {
          "heartbeat_seconds": {
            "title": "Heartbeat Seconds",
            "type": "integer"
          }
        },
        "required": [
          "heartbeat_seconds"
        ],
        "title": "OutreachHelloEventSchema",
        "type": "object"
      },
      "OutreachLinkedInStepsChangedEventSchema": {
        "description": "A LinkedIn account's steps or browser presence changed.\n\n``account_id`` None means more than one account changed in the same\ntransaction.",
        "properties": {
          "account_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Account Id"
          }
        },
        "title": "OutreachLinkedInStepsChangedEventSchema",
        "type": "object"
      },
      "OutreachReconnectEventSchema": {
        "description": "The server is closing the stream on purpose; reconnect straight away.",
        "properties": {},
        "title": "OutreachReconnectEventSchema",
        "type": "object"
      },
      "OutreachResyncEventSchema": {
        "description": "Frames may have been dropped; refetch everything outreach on screen.",
        "properties": {},
        "title": "OutreachResyncEventSchema",
        "type": "object"
      },
      "OutreachStreamEventSchema": {
        "description": "One frame of the workspace's outreach stream, as the documentation describes it.\n\n``kind`` is the SSE ``event:`` field and ``data`` the frame's payload. Every\nframe is a wake-up, never data: the client refetches what the kind names.",
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OutreachHelloEventSchema"
              },
              {
                "$ref": "#/components/schemas/OutreachTasksChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/OutreachContactsChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/OutreachLinkedInStepsChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/OutreachActivityChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/OutreachAccountsChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/OutreachCreditsChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/OutreachResyncEventSchema"
              },
              {
                "$ref": "#/components/schemas/OutreachReconnectEventSchema"
              }
            ],
            "description": "The frame's payload, by kind.",
            "title": "Data"
          },
          "kind": {
            "$ref": "#/components/schemas/OutreachChangeKind",
            "description": "`hello` on connect and `resync` after a gap: refetch everything outreach on screen. `tasks_changed`: the task list and counts. `contacts_changed`: the sequence's contact reads (every sequence's when `sequence_id` is null). `linkedin_steps_changed`: the account's LinkedIn queue, history and state (every account's when `account_id` is null). `activity_changed`: the sender's Activity (every sender's when `sender_profile_id` is null). `accounts_changed`: the account's page and chart and the Accounts list (every account's when `account_key` is null). `credits_changed`: the workspace's credit balance, which a Browser use run or trial charged. `reconnect`: open a new stream."
          }
        },
        "required": [
          "kind",
          "data"
        ],
        "title": "OutreachStreamEventSchema",
        "type": "object"
      },
      "OutreachTaskApprovalReadSchema": {
        "description": "One approved task's row, and when the work it let go is expected to run.",
        "properties": {
          "approved_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Approved At"
          },
          "approved_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who approved it (who marked a Needs human task done), as a name. Null when nobody has, or the person could not be resolved.",
            "title": "Approved By Display Name"
          },
          "ask_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AskReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why this message or step is waiting for a person instead of running on its own. It stays on the task after it is decided, so the history still says why it was asked. Null when no reason was recorded.\n\nAbout the message: `low_confidence` the agent did not rate it high; `insufficient_data` the agent knew too little about the contact to write something only they could receive. Only older tasks carry `findings` (a check found a problem in it, such as a placeholder that never filled in) or `policy` (it broke one of the agent's content rules): checks no longer hold a message.\n\nAbout the settings: `always_ask` the sender has a person approve every email, or every LinkedIn step; `sequence_manual` the sequence asks for approval of every email or LinkedIn step; `step_requires_approval` this step asks for approval; `sender_switched_to_manual` the LinkedIn step was on its way unattended when its sender switched to asking first, so it waits for a person again.\n\nAbout sending limits: `daily_cap` the mailbox has reached its daily limit; `consecutive_cap` the agent sent the last reply and nobody has written since; `thread_cap` the conversation has had as many unattended replies as it may; `hourly_cap` the mailbox has reached its hourly reply limit; `org_daily_cap` the workspace has reached its daily reply limit.\n\nAbout the conversation: `stale_inbound` a newer message arrived, or the one being answered is too old; `unverified_sender` the reply could not be confirmed as coming from the contact; `different_sender` someone other than the contact wrote it; `authentication` it failed email authentication or was marked as spam; `label` the reply is not one the agent answers on its own; `suppressed` the contact is on the do-not-contact list; `sequence_gone` the sequence or the agent's message no longer exists; `linkedin_only` the contact is known only by LinkedIn, so no unsubscribe could be honoured.\n\nAbout the other side: `bot_question` the contact asked whether they are talking to a bot or an AI; `question` the contact asked something a person should answer; `automated_counterparty` the other side appears to be an automated system; `language` the message is not in the expected language.\n\n`kill_switch` unattended sending is paused for the workspace or the platform."
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The rendered message as it will send: an email body, a note, a LinkedIn message.",
            "title": "Body"
          },
          "browser_has_replay": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a Needs human task: whether its Browser use run opened a browser, so a recording may be watched (true), or never opened one and has nothing to watch (false). Null on every other task.",
            "title": "Browser Has Replay"
          },
          "browser_run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a Needs human task: the Browser use run it is about. Its replay is GET /sequences/{sequence_id}/browser-runs/{browser_run_id}/replay/. Null on every other task.",
            "title": "Browser Run Id"
          },
          "channel": {
            "$ref": "#/components/schemas/TaskChannel",
            "description": "`email` or `linkedin` for outreach a person approves; `browser` for a Needs human task: a Browser use run that needed a person. Its contact already went on down the Needs human arm, so it is never approved or rejected, only marked done (POST /outreach-tasks/{id}/complete/), which changes nothing about the contact."
          },
          "confidence": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "How sure the agent was that its message could go out unedited: `high` (a person could send it unread), `medium` (worth a glance) or `low` (needs work). Null when no agent wrote the message.",
            "title": "Confidence"
          },
          "confidence_score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The number behind `confidence`: the agent's own score for its message, from 0 to 100. Read from the agent's message as it stands now. Null when no agent wrote the message, or the agent gave no score.",
            "title": "Confidence Score"
          },
          "contact_company": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's company, from whichever column of the audience table holds it ('Company', 'Company Name', 'Organization' and the like). Null when the table has none or leaves it blank.",
            "title": "Contact Company"
          },
          "contact_fields": {
            "description": "Every filled column of the contact's audience row, in the table's order. Empty for housekeeping work and for a row since deleted.",
            "items": {
              "$ref": "#/components/schemas/OutreachTaskContactFieldSchema"
            },
            "title": "Contact Fields",
            "type": "array"
          },
          "contact_identity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The address, profile slug or number behind the label, so a row can show the name and still say who that is. Equal to the label where no name was found; null for housekeeping.",
            "title": "Contact Identity"
          },
          "contact_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact as the queue names them: a name, else an address or a profile URL.",
            "title": "Contact Label"
          },
          "contact_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's job title, from whichever column of the audience table holds it ('Job Title', 'Title', 'Position' and the like). Null when the table has none or leaves it blank.",
            "title": "Contact Title"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "due_at": {
            "description": "When the channel would run it if nobody were in the way.",
            "format": "date-time",
            "title": "Due At",
            "type": "string"
          },
          "editable": {
            "description": "Whether the queue may rewrite the message before approving: pending, and a kind that carries text.",
            "title": "Editable",
            "type": "boolean"
          },
          "enrolment_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Enrolment Id"
          },
          "flagged": {
            "description": "Whether a check found a problem in the agent's message (any finding at warning strength), whatever `ask_reason` says: a task held for a setting can still carry a message with a placeholder that never filled in. False when no agent wrote the message.",
            "title": "Flagged",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "description": "The LinkedIn action kind slug, `email`, or `needs_human` on a `browser` task.",
            "title": "Kind",
            "type": "string"
          },
          "linkedin_action_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Action Id"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the person wrote when settling it: why they rejected it.",
            "title": "Note"
          },
          "outbound_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The message the Outbound Agent wrote for this task. Null when a person wrote the words, and on a LinkedIn step that carries no message.",
            "title": "Outbound Message Id"
          },
          "outcome": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "How it ended: the channel's own terminal word.",
            "title": "Outcome"
          },
          "progress": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OutreachTaskProgressReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the work stands once the queue has let it go, read from the channel: set on approved, finished and cancelled tasks, null on a task still waiting on a person and on one a person rejected."
          },
          "proposed_learning_changes": {
            "default": 0,
            "description": "How many learnings approving the card saves: the adds, rewrites and removes the waiting Needs work proposes (a session can make several). 0 when none waits, or when its learner could not work out what to learn.",
            "title": "Proposed Learning Changes",
            "type": "integer"
          },
          "proposed_learning_event_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The feedback session waiting on this task (its Unfinished feedback), from a note or from a person's edit of its words: a person's approval saves it. Read it with GET /agent-learnings/thumbs-downs/ (`subject_key` `task:<id>`). Null when none waits.",
            "title": "Proposed Learning Event Id"
          },
          "proposed_learning_redo_state": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RedoState"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the rewrite that waiting learning asked for stands: `started` while the card is written again, `written` once its new words are in, `refused` when the rewrite didn't go through (or never started), so the learning waits for Retry or Discard and approving the card saves nothing with it. Null when no learning waits."
          },
          "reasoning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's reason for its `confidence`, given after it wrote the message: what the message rests on and what it was unsure about. Null when no agent wrote the message. On a Needs human task: why the Browser use run needed a person, in the run's words.",
            "title": "Reasoning"
          },
          "record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Record Id"
          },
          "rejected_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rejected At"
          },
          "rejected_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rejected By Display Name"
          },
          "reply_subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For an email that replies in the contact's existing thread, the subject it will go out with, such as 'Re: Quick question'. Null for a first email, which carries its own `subject`, and for anything that is not an email.",
            "title": "Reply Subject"
          },
          "resolved_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolved At"
          },
          "saved_learnings": {
            "description": "How many learnings the task's Needs work proposed this approval saved: 1 or 0. A proposed learning whose list is full is left unsaved while the approval stands, so a card that proposed one and answers 0 saved nothing. On a dry run, how many approving it would save.",
            "title": "Saved Learnings",
            "type": "integer"
          },
          "saved_learnings_for_all_sequences": {
            "description": "Of saved_learnings, how many apply to every sequence, not only their own.",
            "title": "Saved Learnings For All Sequences",
            "type": "integer"
          },
          "schedule": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OutreachApprovalScheduleReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the approved step is expected to run, as the bulk approve reports it. Null when the task had moved on instead of being approved, or when the schedule could not be read (the approval stands either way)."
          },
          "sender_browser_online": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a LinkedIn task still waiting on a person: whether a browser is checked in for its sender right now, so approving it would run it soon. False means an approved step waits until a browser is open. Null for every other task.",
            "title": "Sender Browser Online"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sender Profile Id"
          },
          "sender_profile_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Null when nobody in particular sends it, or the sender was deleted.",
            "title": "Sender Profile Name"
          },
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sequence Id"
          },
          "sequence_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Null for housekeeping work, or for a sequence since deleted.",
            "title": "Sequence Name"
          },
          "sequence_paused": {
            "default": false,
            "description": "Its sequence is paused right now: approving the task records the approval, and the step waits for Resume sequence before it runs, on either channel.",
            "title": "Sequence Paused",
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/TaskStatus"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Id"
          },
          "step_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step as the builder names it; null when the step no longer exists.",
            "title": "Step Name"
          },
          "step_position": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step's customer-visible ordinal, zero-based; null with the name.",
            "title": "Step Position"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "words_edited": {
            "description": "Whether a person changed the words the card shows (an edit saved before approving). Needs work is refused on such a card: the edit proposes its own learning instead. False again once the agent writes the card's words anew.",
            "title": "Words Edited",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "channel",
          "kind",
          "status",
          "sequence_id",
          "sequence_name",
          "step_id",
          "step_name",
          "step_position",
          "enrolment_id",
          "record_id",
          "sender_profile_id",
          "sender_profile_name",
          "contact_label",
          "subject",
          "body",
          "due_at",
          "created_at",
          "updated_at",
          "approved_at",
          "approved_by_display_name",
          "rejected_at",
          "rejected_by_display_name",
          "resolved_at",
          "outcome",
          "note",
          "linkedin_action_id",
          "editable",
          "outbound_message_id",
          "words_edited",
          "confidence",
          "confidence_score",
          "flagged",
          "reasoning",
          "ask_reason",
          "saved_learnings",
          "saved_learnings_for_all_sequences"
        ],
        "title": "OutreachTaskApprovalReadSchema",
        "type": "object"
      },
      "OutreachTaskApproveSchema": {
        "description": "Whether the person read the task before approving it.",
        "properties": {
          "opened": {
            "default": false,
            "description": "The person opened the task and read its message before approving. Words the agent wrote that they approved without changing are then recorded as approved as written: a record of their Looks good, which saves no learning.",
            "title": "Opened",
            "type": "boolean"
          },
          "rev": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The card's feedback session `rev` as read. When sent, a session a note or an edit changed since is refused (409) and the task still waits; left out, the approval saves the session as it stands.",
            "title": "Rev"
          }
        },
        "title": "OutreachTaskApproveSchema",
        "type": "object"
      },
      "OutreachTaskContactFieldSchema": {
        "description": "One filled column of the contact's audience row.",
        "properties": {
          "name": {
            "description": "The column's header, as the table names it.",
            "title": "Name",
            "type": "string"
          },
          "value": {
            "description": "What the row holds there, as text; long values are cut.",
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "name",
          "value"
        ],
        "title": "OutreachTaskContactFieldSchema",
        "type": "object"
      },
      "OutreachTaskCountSchema": {
        "description": "The nav badge's count, and the failures that can still be retried.",
        "properties": {
          "failed_retryable": {
            "description": "Failed LinkedIn steps whose contact can still be retried (the contact is still stopped as failed). Not part of the badge.",
            "title": "Failed Retryable",
            "type": "integer"
          },
          "pending": {
            "description": "Tasks waiting on a person: the nav badge.",
            "title": "Pending",
            "type": "integer"
          }
        },
        "required": [
          "pending",
          "failed_retryable"
        ],
        "title": "OutreachTaskCountSchema",
        "type": "object"
      },
      "OutreachTaskEditSchema": {
        "description": "Rewrite what a pending task will send.\n\n``subject`` left out keeps the subject the task already carries; an\nexplicit null clears it, which for an email means the follow-up lands\nin-thread. The two are told apart on the wire so a client fixing a typo\nin the body cannot silently strip a first email's subject.",
        "properties": {
          "body": {
            "maxLength": 50000,
            "minLength": 1,
            "title": "Body",
            "type": "string"
          },
          "expected_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The task's `outbound_message_id` as the editor read it: an edit over a message written again since (a saved learning's rewrite, a Needs work) is refused with 409, so words typed over the old message never land on the new one.",
            "title": "Expected Message Id"
          },
          "subject": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          }
        },
        "required": [
          "body"
        ],
        "title": "OutreachTaskEditSchema",
        "type": "object"
      },
      "OutreachTaskEmailReadSchema": {
        "description": "An email card's email beyond its words: what the send adds below them, and what left.",
        "properties": {
          "closing": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EmailClosingReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the send adds below the card's words, the sender's signature and then the sequence's opt-out footer, so the card shows the email whole as the contact will get it. Its unsubscribe link unsubscribes nobody. Null for a LinkedIn task or one no sequence sends."
          },
          "email_html": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Once the email went, its HTML part exactly as it was handed to Gmail: the words, the signature and the footer, every line and space as the contact got them. Null until it goes.",
            "title": "Email Html"
          },
          "plain_text_only": {
            "default": true,
            "description": "Whether the sequence sends plain text, which is how the words and the closing are laid out: marks stripped, or bold, italic and links kept.",
            "title": "Plain Text Only",
            "type": "boolean"
          }
        },
        "required": [
          "closing",
          "email_html"
        ],
        "title": "OutreachTaskEmailReadSchema",
        "type": "object"
      },
      "OutreachTaskLaterStepSchema": {
        "description": "One step after an email card's whose words the agent writes only when the contact reaches it.\n\nIt sits on a branch the agent does not draft ahead (a connection request's Connected\nbranch, a check's Yes branch), so the card has no words to show for it. Approving the\ncard does not approve it.",
        "properties": {
          "channel": {
            "$ref": "#/components/schemas/TaskChannel",
            "description": "Where its words go: `email` or `linkedin`."
          },
          "label": {
            "description": "The step as its writer names it, its number and its name: `Step 4 \u00b7 Send message`.",
            "title": "Label",
            "type": "string"
          },
          "step_id": {
            "description": "The step.",
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          }
        },
        "required": [
          "step_id",
          "label",
          "channel"
        ],
        "title": "OutreachTaskLaterStepSchema",
        "type": "object"
      },
      "OutreachTaskLengthSchema": {
        "description": "How many tasks the queue's filters select, and why: the footer and Why it needs approval.",
        "properties": {
          "ask_reasons": {
            "description": "Why the tasks every other filter selects are held for a person, the reasons Why it needs approval can narrow them to: `ask_reason` itself is left out of this read, so picking one never hides the others. Empty when none of them carries a reason.",
            "items": {
              "$ref": "#/components/schemas/AskReason"
            },
            "title": "Ask Reasons",
            "type": "array"
          },
          "count": {
            "description": "How many tasks match the filters.",
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count",
          "ask_reasons"
        ],
        "title": "OutreachTaskLengthSchema",
        "type": "object"
      },
      "OutreachTaskProgressReadSchema": {
        "description": "Where an approved, finished or failed task's work stands, read from its channel.",
        "properties": {
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a failed LinkedIn step failed, as the channel's error code; null otherwise.",
            "title": "Error Code"
          },
          "error_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why it failed, as a sentence from the channel or the send engine; null otherwise.",
            "title": "Error Message"
          },
          "hold": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StepHold"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a `paused` task, what holds it: `sequence_paused` its sequence is paused, `contact_paused` its contact is. Null otherwise."
          },
          "hold_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HoldReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why a held email waits: `window` the sequence's sending window is closed, `daily_cap` its mailboxes are out of today's capacity, `pacing` the mailbox's next slot is later, `no_mailbox` no mailbox is connected, `agent_writing` / `agent_queued` / `agent_unavailable` / `no_message` its words are not ready (`agent_queued`: in line to be written, behind the messages the sequence already keeps written ahead), `confirming_send` Gmail never confirmed the last send and it is being checked before anything is sent again; and why a held LinkedIn step waits: `no_linkedin_account` no sender on the sequence has LinkedIn connected. Null otherwise."
          },
          "linkedin_queue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInQueueState"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a queued or running LinkedIn step, where it stands in its account's line: `queued` (with `starts_at` and `steps_ahead`), `running`, `outside_window` (its sequence's sending hours are shut in the sender's timezone; `starts_at` is when it is expected to start once they open), `daily_limit` or `weekly_limit` (with `resets_at`), `kind_disabled` (this kind's limit is 0), `browser_offline` (no browser checked in for the sender), `verify_account` (LinkedIn is asking the member to verify the account) or `disconnected` (the account is not connected). Null otherwise."
          },
          "may_have_sent": {
            "description": "A failed LinkedIn message or InMail that may have reached the person anyway (the browser timed out, lost its tab or went silent mid-step): a retry could send it twice, so confirm first.",
            "title": "May Have Sent",
            "type": "boolean"
          },
          "pause_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a task its paused sequence holds, why the sequence paused, as the sequence's own `pause_reason` (`manual`, `credits`, `spending_limit`, `bounces`, `mailboxes`, `linkedin`). Null otherwise.",
            "title": "Pause Reason"
          },
          "resets_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The reset that frees a LinkedIn step a daily or weekly limit holds, midnight in the sender's timezone; null otherwise.",
            "title": "Resets At"
          },
          "retryable": {
            "description": "The contact is stopped as failed at this moment, so a retry of their journey (the `retry` journey action on their enrolment) runs the step again.",
            "title": "Retryable",
            "type": "boolean"
          },
          "starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it is expected to start: a LinkedIn step's forecast, or when a held email's wait ends. An estimate; null when no time can honestly be named.",
            "title": "Starts At"
          },
          "state": {
            "$ref": "#/components/schemas/TaskProgressState",
            "description": "Where the work stands. `queued` it is in its sender's LinkedIn line (see `linkedin_queue`), or approved and about to join it; `running` a browser is doing it now; `sending` an approved email is going out now; `held` an approved email, or an approved LinkedIn step not yet in its sender's line, waits (see `hold_reason` and `starts_at`); `paused` an approved step on either channel waits for its paused sequence or paused contact to be resumed (see `hold` and `pause_reason`) and is in no line until then; `sent` it happened; `skipped` it did not apply, or was passed over in the extension; `failed` it could not be done (see `error_code`, `retryable`); `rejected` a person refused it; `stopped` the contact was stopped under it, or it was replaced."
          },
          "steps_ahead": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many of the sender's LinkedIn steps run before this one; null otherwise.",
            "title": "Steps Ahead"
          }
        },
        "required": [
          "state",
          "linkedin_queue",
          "starts_at",
          "steps_ahead",
          "resets_at",
          "hold_reason",
          "error_code",
          "error_message",
          "retryable",
          "may_have_sent"
        ],
        "title": "OutreachTaskProgressReadSchema",
        "type": "object"
      },
      "OutreachTaskReadSchema": {
        "description": "One row of the approval queue, every name the page shows resolved server-side.\n\nThe task table stores ids; the page shows names. The sequence, the step,\nthe sender and the deciding person are all resolved here rather than by\nthe client, so no raw actor id ever crosses the wire and a sequence or\nsender since deleted reads as a blank rather than a broken lookup.",
        "properties": {
          "approved_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Approved At"
          },
          "approved_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who approved it (who marked a Needs human task done), as a name. Null when nobody has, or the person could not be resolved.",
            "title": "Approved By Display Name"
          },
          "ask_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AskReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why this message or step is waiting for a person instead of running on its own. It stays on the task after it is decided, so the history still says why it was asked. Null when no reason was recorded.\n\nAbout the message: `low_confidence` the agent did not rate it high; `insufficient_data` the agent knew too little about the contact to write something only they could receive. Only older tasks carry `findings` (a check found a problem in it, such as a placeholder that never filled in) or `policy` (it broke one of the agent's content rules): checks no longer hold a message.\n\nAbout the settings: `always_ask` the sender has a person approve every email, or every LinkedIn step; `sequence_manual` the sequence asks for approval of every email or LinkedIn step; `step_requires_approval` this step asks for approval; `sender_switched_to_manual` the LinkedIn step was on its way unattended when its sender switched to asking first, so it waits for a person again.\n\nAbout sending limits: `daily_cap` the mailbox has reached its daily limit; `consecutive_cap` the agent sent the last reply and nobody has written since; `thread_cap` the conversation has had as many unattended replies as it may; `hourly_cap` the mailbox has reached its hourly reply limit; `org_daily_cap` the workspace has reached its daily reply limit.\n\nAbout the conversation: `stale_inbound` a newer message arrived, or the one being answered is too old; `unverified_sender` the reply could not be confirmed as coming from the contact; `different_sender` someone other than the contact wrote it; `authentication` it failed email authentication or was marked as spam; `label` the reply is not one the agent answers on its own; `suppressed` the contact is on the do-not-contact list; `sequence_gone` the sequence or the agent's message no longer exists; `linkedin_only` the contact is known only by LinkedIn, so no unsubscribe could be honoured.\n\nAbout the other side: `bot_question` the contact asked whether they are talking to a bot or an AI; `question` the contact asked something a person should answer; `automated_counterparty` the other side appears to be an automated system; `language` the message is not in the expected language.\n\n`kill_switch` unattended sending is paused for the workspace or the platform."
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The rendered message as it will send: an email body, a note, a LinkedIn message.",
            "title": "Body"
          },
          "browser_has_replay": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a Needs human task: whether its Browser use run opened a browser, so a recording may be watched (true), or never opened one and has nothing to watch (false). Null on every other task.",
            "title": "Browser Has Replay"
          },
          "browser_run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a Needs human task: the Browser use run it is about. Its replay is GET /sequences/{sequence_id}/browser-runs/{browser_run_id}/replay/. Null on every other task.",
            "title": "Browser Run Id"
          },
          "channel": {
            "$ref": "#/components/schemas/TaskChannel",
            "description": "`email` or `linkedin` for outreach a person approves; `browser` for a Needs human task: a Browser use run that needed a person. Its contact already went on down the Needs human arm, so it is never approved or rejected, only marked done (POST /outreach-tasks/{id}/complete/), which changes nothing about the contact."
          },
          "confidence": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "How sure the agent was that its message could go out unedited: `high` (a person could send it unread), `medium` (worth a glance) or `low` (needs work). Null when no agent wrote the message.",
            "title": "Confidence"
          },
          "confidence_score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The number behind `confidence`: the agent's own score for its message, from 0 to 100. Read from the agent's message as it stands now. Null when no agent wrote the message, or the agent gave no score.",
            "title": "Confidence Score"
          },
          "contact_company": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's company, from whichever column of the audience table holds it ('Company', 'Company Name', 'Organization' and the like). Null when the table has none or leaves it blank.",
            "title": "Contact Company"
          },
          "contact_fields": {
            "description": "Every filled column of the contact's audience row, in the table's order. Empty for housekeeping work and for a row since deleted.",
            "items": {
              "$ref": "#/components/schemas/OutreachTaskContactFieldSchema"
            },
            "title": "Contact Fields",
            "type": "array"
          },
          "contact_identity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The address, profile slug or number behind the label, so a row can show the name and still say who that is. Equal to the label where no name was found; null for housekeeping.",
            "title": "Contact Identity"
          },
          "contact_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact as the queue names them: a name, else an address or a profile URL.",
            "title": "Contact Label"
          },
          "contact_title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's job title, from whichever column of the audience table holds it ('Job Title', 'Title', 'Position' and the like). Null when the table has none or leaves it blank.",
            "title": "Contact Title"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "due_at": {
            "description": "When the channel would run it if nobody were in the way.",
            "format": "date-time",
            "title": "Due At",
            "type": "string"
          },
          "editable": {
            "description": "Whether the queue may rewrite the message before approving: pending, and a kind that carries text.",
            "title": "Editable",
            "type": "boolean"
          },
          "enrolment_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Enrolment Id"
          },
          "flagged": {
            "description": "Whether a check found a problem in the agent's message (any finding at warning strength), whatever `ask_reason` says: a task held for a setting can still carry a message with a placeholder that never filled in. False when no agent wrote the message.",
            "title": "Flagged",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "description": "The LinkedIn action kind slug, `email`, or `needs_human` on a `browser` task.",
            "title": "Kind",
            "type": "string"
          },
          "linkedin_action_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Action Id"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the person wrote when settling it: why they rejected it.",
            "title": "Note"
          },
          "outbound_message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The message the Outbound Agent wrote for this task. Null when a person wrote the words, and on a LinkedIn step that carries no message.",
            "title": "Outbound Message Id"
          },
          "outcome": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "How it ended: the channel's own terminal word.",
            "title": "Outcome"
          },
          "progress": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OutreachTaskProgressReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the work stands once the queue has let it go, read from the channel: set on approved, finished and cancelled tasks, null on a task still waiting on a person and on one a person rejected."
          },
          "proposed_learning_changes": {
            "default": 0,
            "description": "How many learnings approving the card saves: the adds, rewrites and removes the waiting Needs work proposes (a session can make several). 0 when none waits, or when its learner could not work out what to learn.",
            "title": "Proposed Learning Changes",
            "type": "integer"
          },
          "proposed_learning_event_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The feedback session waiting on this task (its Unfinished feedback), from a note or from a person's edit of its words: a person's approval saves it. Read it with GET /agent-learnings/thumbs-downs/ (`subject_key` `task:<id>`). Null when none waits.",
            "title": "Proposed Learning Event Id"
          },
          "proposed_learning_redo_state": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RedoState"
              },
              {
                "type": "null"
              }
            ],
            "description": "How the rewrite that waiting learning asked for stands: `started` while the card is written again, `written` once its new words are in, `refused` when the rewrite didn't go through (or never started), so the learning waits for Retry or Discard and approving the card saves nothing with it. Null when no learning waits."
          },
          "reasoning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's reason for its `confidence`, given after it wrote the message: what the message rests on and what it was unsure about. Null when no agent wrote the message. On a Needs human task: why the Browser use run needed a person, in the run's words.",
            "title": "Reasoning"
          },
          "record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Record Id"
          },
          "rejected_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rejected At"
          },
          "rejected_by_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rejected By Display Name"
          },
          "reply_subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For an email that replies in the contact's existing thread, the subject it will go out with, such as 'Re: Quick question'. Null for a first email, which carries its own `subject`, and for anything that is not an email.",
            "title": "Reply Subject"
          },
          "resolved_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolved At"
          },
          "sender_browser_online": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a LinkedIn task still waiting on a person: whether a browser is checked in for its sender right now, so approving it would run it soon. False means an approved step waits until a browser is open. Null for every other task.",
            "title": "Sender Browser Online"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sender Profile Id"
          },
          "sender_profile_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Null when nobody in particular sends it, or the sender was deleted.",
            "title": "Sender Profile Name"
          },
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sequence Id"
          },
          "sequence_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Null for housekeeping work, or for a sequence since deleted.",
            "title": "Sequence Name"
          },
          "sequence_paused": {
            "default": false,
            "description": "Its sequence is paused right now: approving the task records the approval, and the step waits for Resume sequence before it runs, on either channel.",
            "title": "Sequence Paused",
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/TaskStatus"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Id"
          },
          "step_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step as the builder names it; null when the step no longer exists.",
            "title": "Step Name"
          },
          "step_position": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step's customer-visible ordinal, zero-based; null with the name.",
            "title": "Step Position"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "words_edited": {
            "description": "Whether a person changed the words the card shows (an edit saved before approving). Needs work is refused on such a card: the edit proposes its own learning instead. False again once the agent writes the card's words anew.",
            "title": "Words Edited",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "channel",
          "kind",
          "status",
          "sequence_id",
          "sequence_name",
          "step_id",
          "step_name",
          "step_position",
          "enrolment_id",
          "record_id",
          "sender_profile_id",
          "sender_profile_name",
          "contact_label",
          "subject",
          "body",
          "due_at",
          "created_at",
          "updated_at",
          "approved_at",
          "approved_by_display_name",
          "rejected_at",
          "rejected_by_display_name",
          "resolved_at",
          "outcome",
          "note",
          "linkedin_action_id",
          "editable",
          "outbound_message_id",
          "words_edited",
          "confidence",
          "confidence_score",
          "flagged",
          "reasoning",
          "ask_reason"
        ],
        "title": "OutreachTaskReadSchema",
        "type": "object"
      },
      "OutreachTaskRejectSchema": {
        "description": "A note about the person a task was refused for; kept on the row.",
        "properties": {
          "reason": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Optional note kept on the task about why this person should not hear from the sequence. Never about the writing (Needs work is). Saves no learning. The screen sends none.",
            "title": "Reason"
          }
        },
        "title": "OutreachTaskRejectSchema",
        "type": "object"
      },
      "OutreachTaskThreadEditSchema": {
        "description": "Rewrite one follow-up on a pending email card.\n\n``subject`` left out keeps the follow-up's own subject; a follow-up that\nreplies in the thread above it has none, and any given to it is ignored.",
        "properties": {
          "body": {
            "maxLength": 50000,
            "minLength": 1,
            "title": "Body",
            "type": "string"
          },
          "message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The follow-up's message_id as the card read it: an edit over a follow-up written again since is refused with 409.",
            "title": "Message Id"
          },
          "subject": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A new subject for a follow-up that has its own; leave it out to keep it.",
            "title": "Subject"
          }
        },
        "required": [
          "body"
        ],
        "title": "OutreachTaskThreadEditSchema",
        "type": "object"
      },
      "OutreachTaskThreadEmailSchema": {
        "description": "One follow-up the agent drafted with the card's email: approving the card approves it.\n\nThe follow-ups after the card's own email, in the order they go. One approval\ncovers them all: approving the card approves each to send as written when its\nturn comes, with no card of its own, and rejecting the card stops the contact.",
        "properties": {
          "body": {
            "description": "What it will send, as drafted or as a person edited it.",
            "title": "Body",
            "type": "string"
          },
          "message_id": {
            "description": "The agent's message holding its words; a new one when it is written again.",
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          },
          "step_id": {
            "description": "The follow-up's step.",
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Its own subject, or null when it replies in the thread above it.",
            "title": "Subject"
          },
          "wait_amount": {
            "description": "How long after the email before it the step waits.",
            "title": "Wait Amount",
            "type": "integer"
          },
          "wait_unit": {
            "description": "The unit of that wait: `minutes`, `hours` or `days`.",
            "title": "Wait Unit",
            "type": "string"
          }
        },
        "required": [
          "step_id",
          "message_id",
          "subject",
          "body",
          "wait_amount",
          "wait_unit"
        ],
        "title": "OutreachTaskThreadEmailSchema",
        "type": "object"
      },
      "OutreachTasksChangedEventSchema": {
        "description": "Something in the approval queue changed; refetch the task list and count.",
        "properties": {},
        "title": "OutreachTasksChangedEventSchema",
        "type": "object"
      },
      "OverrideTargetSchema": {
        "description": "One contact's own words for one step, saved over the agent's sample in the Builder.",
        "properties": {
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "sequence_id": {
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "target_kind": {
            "const": "override",
            "title": "Target Kind",
            "type": "string"
          }
        },
        "required": [
          "target_kind",
          "sequence_id",
          "step_id",
          "record_id"
        ],
        "title": "OverrideTargetSchema",
        "type": "object"
      },
      "PageContextSchema-Input": {
        "description": "What the person had open when they sent the message.\n\nSo \"this table\" resolves without them naming it. Sent by the dashboard,\noptional everywhere: a message from anywhere else simply carries none.\nKept with the message and read back with it, so the transcript can say\nwhere each message was sent from.",
        "properties": {
          "entity_id": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The id of that thing; an account's is its key (`acme.com`).",
            "title": "Entity Id"
          },
          "entity_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What it is called, as the page showed it, so the assistant can say it back. Cut to 255 characters rather than refused.",
            "title": "Entity Name"
          },
          "entity_type": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the page is about: `table`, `sequence`, `agent`, `integration`, `inbox thread`, `sender`, `mailbox` or `account`. Null on a page about no one thing.",
            "title": "Entity Type"
          },
          "on_screen": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OnScreenSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the page shows beyond its address: its filters, view, search, order, dates, what is ticked or open, and the words in an unsaved box."
          },
          "page_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The page or tab they have open, in the screen's own words: a sequence's \"Audience\" tab, an agent's \"Train\", or a page about no one thing, such as \"Tasks\".",
            "title": "Page Name"
          },
          "route": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The path they have open, e.g. `/tables/1234`.",
            "title": "Route"
          },
          "selected_step_id": {
            "anyOf": [
              {
                "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The selected sequence builder step; resolve it against the sequence before editing.",
            "title": "Selected Step Id"
          },
          "selected_step_label": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The selected step as the Builder numbers and names it, e.g. \"Step 1 \u00b7 Opener\". The id is what to edit by; this is how the person sees it.",
            "title": "Selected Step Label"
          }
        },
        "title": "PageContextSchema",
        "type": "object"
      },
      "PageContextSchema-Output": {
        "description": "What the person had open when they sent the message.\n\nSo \"this table\" resolves without them naming it. Sent by the dashboard,\noptional everywhere: a message from anywhere else simply carries none.\nKept with the message and read back with it, so the transcript can say\nwhere each message was sent from.",
        "properties": {
          "entity_id": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The id of that thing; an account's is its key (`acme.com`).",
            "title": "Entity Id"
          },
          "entity_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What it is called, as the page showed it, so the assistant can say it back. Cut to 255 characters rather than refused.",
            "title": "Entity Name"
          },
          "entity_type": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the page is about: `table`, `sequence`, `agent`, `integration`, `inbox thread`, `sender`, `mailbox` or `account`. Null on a page about no one thing.",
            "title": "Entity Type"
          },
          "on_screen": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OnScreenSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the page shows beyond its address: its filters, view, search, order, dates, what is ticked or open, and the words in an unsaved box."
          },
          "page_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The page or tab they have open, in the screen's own words: a sequence's \"Audience\" tab, an agent's \"Train\", or a page about no one thing, such as \"Tasks\".",
            "title": "Page Name"
          },
          "route": {
            "anyOf": [
              {
                "maxLength": 500,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The path they have open, e.g. `/tables/1234`.",
            "title": "Route"
          },
          "selected_step_id": {
            "anyOf": [
              {
                "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The selected sequence builder step; resolve it against the sequence before editing.",
            "title": "Selected Step Id"
          },
          "selected_step_label": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The selected step as the Builder numbers and names it, e.g. \"Step 1 \u00b7 Opener\". The id is what to edit by; this is how the person sees it.",
            "title": "Selected Step Label"
          }
        },
        "title": "PageContextSchema",
        "type": "object"
      },
      "PaginatedResponse_APIKeyReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/APIKeyReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[APIKeyReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_APIKeyScopeReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/APIKeyScopeReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[APIKeyScopeReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AccountChartChangeReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AccountChartChangeReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AccountChartChangeReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AccountIndustryReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AccountIndustryReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AccountIndustryReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AccountMergeReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AccountMergeReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AccountMergeReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AccountOwnerReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AccountOwnerReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AccountOwnerReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AccountPersonReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AccountPersonReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AccountPersonReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AccountReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AccountReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AccountReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AccountSourceReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AccountSourceReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AccountSourceReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ActionProposalReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ActionProposalReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ActionProposalReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AffiliateDailyStatReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AffiliateDailyStatReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AffiliateDailyStatReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AffiliateFeedItemReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AffiliateFeedItemReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AffiliateFeedItemReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AffiliateLedgerEntryReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AffiliateLedgerEntryReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AffiliateLedgerEntryReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AffiliatePayoutReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AffiliatePayoutReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AffiliatePayoutReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AffiliateReferralReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AffiliateReferralReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AffiliateReferralReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AffiliateSourceStatReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AffiliateSourceStatReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AffiliateSourceStatReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AgentLearningReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AgentLearningReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AgentLearningReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AgentToolAvailabilitySchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AgentToolAvailabilitySchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AgentToolAvailabilitySchema]",
        "type": "object"
      },
      "PaginatedResponse_AiAppReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AiAppReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AiAppReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AiContextDocumentReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AiContextDocumentReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AiContextDocumentReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AiContextQaEntrySchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AiContextQaEntrySchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AiContextQaEntrySchema]",
        "type": "object"
      },
      "PaginatedResponse_AiDraftReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AiDraftReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AiDraftReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AssistantPromptReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AssistantPromptReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AssistantPromptReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AssistantThreadReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AssistantThreadReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AssistantThreadReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_AudienceRefusalReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/AudienceRefusalReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[AudienceRefusalReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_BrowserTrialReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/BrowserTrialReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[BrowserTrialReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_BuiltInMessageTemplateReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/BuiltInMessageTemplateReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[BuiltInMessageTemplateReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_BuiltinAgentTemplateSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/BuiltinAgentTemplateSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[BuiltinAgentTemplateSchema]",
        "type": "object"
      },
      "PaginatedResponse_CategoryReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/CategoryReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[CategoryReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ChatAttachmentColumnValueReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ChatAttachmentColumnValueReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ChatAttachmentColumnValueReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ChatAttachmentCommentReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ChatAttachmentCommentReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ChatAttachmentCommentReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ChatAttachmentPageReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ChatAttachmentPageReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ChatAttachmentPageReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ChatAttachmentRowReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ChatAttachmentRowReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ChatAttachmentRowReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ColumnCreditRateSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ColumnCreditRateSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ColumnCreditRateSchema]",
        "type": "object"
      },
      "PaginatedResponse_ColumnTemplateReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ColumnTemplateReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ColumnTemplateReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ConnectInputSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ConnectInputSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ConnectInputSchema]",
        "type": "object"
      },
      "PaginatedResponse_ConnectionRecordTypeReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ConnectionRecordTypeReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ConnectionRecordTypeReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ContactHistoryEntryReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ContactHistoryEntryReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ContactHistoryEntryReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_CreditAttributionEntitySchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/CreditAttributionEntitySchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[CreditAttributionEntitySchema]",
        "type": "object"
      },
      "PaginatedResponse_CreditLedgerEntrySchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/CreditLedgerEntrySchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[CreditLedgerEntrySchema]",
        "type": "object"
      },
      "PaginatedResponse_CreditRunUsageSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/CreditRunUsageSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[CreditRunUsageSchema]",
        "type": "object"
      },
      "PaginatedResponse_DesignPartnerFeedbackReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/DesignPartnerFeedbackReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[DesignPartnerFeedbackReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_EnrichmentActionSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentActionSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[EnrichmentActionSchema]",
        "type": "object"
      },
      "PaginatedResponse_EnrichmentAuditLogReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentAuditLogReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[EnrichmentAuditLogReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_EnrichmentModelSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/EnrichmentModelSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[EnrichmentModelSchema]",
        "type": "object"
      },
      "PaginatedResponse_EnrolmentReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/EnrolmentReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[EnrolmentReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_FunctionCatalogEntrySchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/FunctionCatalogEntrySchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[FunctionCatalogEntrySchema]",
        "type": "object"
      },
      "PaginatedResponse_HealthCheckReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/HealthCheckReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[HealthCheckReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ImportColumnValueSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ImportColumnValueSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ImportColumnValueSchema]",
        "type": "object"
      },
      "PaginatedResponse_InboxkitDomainReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/InboxkitDomainReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[InboxkitDomainReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_InboxkitImportRunReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/InboxkitImportRunReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[InboxkitImportRunReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_InboxkitInventoryDomainReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/InboxkitInventoryDomainReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[InboxkitInventoryDomainReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_IntegrationAuditLogReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/IntegrationAuditLogReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[IntegrationAuditLogReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_IntegrationReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/IntegrationReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[IntegrationReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_IntegrationRecordTypeReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/IntegrationRecordTypeReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[IntegrationRecordTypeReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_IntegrationTypeReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/IntegrationTypeReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[IntegrationTypeReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_InvoiceReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/InvoiceReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[InvoiceReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_LabelReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LabelReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LabelReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_LeadColumnSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LeadColumnSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LeadColumnSchema]",
        "type": "object"
      },
      "PaginatedResponse_LeadEnrichmentOptionSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LeadEnrichmentOptionSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LeadEnrichmentOptionSchema]",
        "type": "object"
      },
      "PaginatedResponse_LeadSearchHistoryEntrySchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LeadSearchHistoryEntrySchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LeadSearchHistoryEntrySchema]",
        "type": "object"
      },
      "PaginatedResponse_LeadSearchRunLogSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LeadSearchRunLogSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LeadSearchRunLogSchema]",
        "type": "object"
      },
      "PaginatedResponse_LeadSignalTypeGroupSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LeadSignalTypeGroupSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LeadSignalTypeGroupSchema]",
        "type": "object"
      },
      "PaginatedResponse_LearningVersionReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LearningVersionReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LearningVersionReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_LinkReaderReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LinkReaderReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LinkReaderReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_LinkedInActionReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LinkedInActionReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LinkedInActionReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_LookupIdentityFieldSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/LookupIdentityFieldSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[LookupIdentityFieldSchema]",
        "type": "object"
      },
      "PaginatedResponse_MailboxBounceSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/MailboxBounceSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[MailboxBounceSchema]",
        "type": "object"
      },
      "PaginatedResponse_MailboxReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/MailboxReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[MailboxReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_McpCatalogTileSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/McpCatalogTileSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[McpCatalogTileSchema]",
        "type": "object"
      },
      "PaginatedResponse_McpServerReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/McpServerReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[McpServerReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_MessageReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/MessageReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[MessageReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_MessageTemplateReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/MessageTemplateReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[MessageTemplateReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_MyGrantReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/MyGrantReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[MyGrantReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_NotificationRuleReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/NotificationRuleReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[NotificationRuleReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutboundAgentVersionReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutboundAgentVersionReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutboundAgentVersionReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutboundCampaignReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutboundCampaignReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutboundCampaignReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutboundConversationReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutboundConversationReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutboundConversationReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutboundFeedbackReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutboundFeedbackReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutboundFeedbackReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutboundPricePointReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutboundPricePointReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutboundPricePointReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutreachActivityReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutreachActivityReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutreachActivityReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutreachTaskLaterStepSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutreachTaskLaterStepSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutreachTaskLaterStepSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutreachTaskReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutreachTaskReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutreachTaskReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_OutreachTaskThreadEmailSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/OutreachTaskThreadEmailSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[OutreachTaskThreadEmailSchema]",
        "type": "object"
      },
      "PaginatedResponse_PointingRowReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/PointingRowReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[PointingRowReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ProductReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ProductReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ProductReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_PropertyReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/PropertyReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[PropertyReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ReferenceFieldChoiceReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ReferenceFieldChoiceReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ReferenceFieldChoiceReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ReferralReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ReferralReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ReferralReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SavedAgentReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SavedAgentReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SavedAgentReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SavedAgentUsageReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SavedAgentUsageReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SavedAgentUsageReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SavedAgentVersionReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SavedAgentVersionReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SavedAgentVersionReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SavedLeadSearchResponseSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SavedLeadSearchResponseSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SavedLeadSearchResponseSchema]",
        "type": "object"
      },
      "PaginatedResponse_SavedViewReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SavedViewReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SavedViewReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SenderProfileReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SenderProfileReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SenderProfileReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SequenceAgentExampleReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SequenceAgentExampleReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SequenceAgentExampleReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SequenceAuditLogReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SequenceAuditLogReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SequenceAuditLogReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SequenceFolderSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SequenceFolderSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SequenceFolderSchema]",
        "type": "object"
      },
      "PaginatedResponse_SequenceReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SequenceReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SequenceReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SequenceTemplateReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SequenceTemplateReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SequenceTemplateReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SequenceTrainingAudienceContactSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SequenceTrainingAudienceContactSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SequenceTrainingAudienceContactSchema]",
        "type": "object"
      },
      "PaginatedResponse_SequenceTrainingWithMatchReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SequenceTrainingWithMatchReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SequenceTrainingWithMatchReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SequenceWriteFromColumnReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SequenceWriteFromColumnReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SequenceWriteFromColumnReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SlackChannelReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SlackChannelReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SlackChannelReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SlackConnectionReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SlackConnectionReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SlackConnectionReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SourceIdentityOptionSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SourceIdentityOptionSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SourceIdentityOptionSchema]",
        "type": "object"
      },
      "PaginatedResponse_StartupLaunchBatchReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/StartupLaunchBatchReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[StartupLaunchBatchReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_StartupLaunchFilterReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/StartupLaunchFilterReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[StartupLaunchFilterReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_StartupLaunchSourceReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/StartupLaunchSourceReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[StartupLaunchSourceReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_StepPerformanceReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/StepPerformanceReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[StepPerformanceReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_SuppressionEntryReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/SuppressionEntryReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[SuppressionEntryReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableColumnGroupReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableColumnGroupReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableColumnGroupReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableColumnWithUIPrefsSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableColumnWithUIPrefsSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableColumnWithUIPrefsSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableFolderSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableFolderSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableFolderSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableOwnerReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableOwnerReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableOwnerReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableRowSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableRowSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableRowSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableRowSearchMatchSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableRowSearchMatchSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableRowSearchMatchSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableRunReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableRunReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableRunReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableSourceRunSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableSourceRunSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableSourceRunSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableSourceRunSkipSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableSourceRunSkipSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableSourceRunSkipSchema]",
        "type": "object"
      },
      "PaginatedResponse_TableViewReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TableViewReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TableViewReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ThreadReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ThreadReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ThreadReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ThumbsDownEventReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ThumbsDownEventReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ThumbsDownEventReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_ToolReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/ToolReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[ToolReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_TrainingSessionReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/TrainingSessionReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[TrainingSessionReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_UUID_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[UUID]",
        "type": "object"
      },
      "PaginatedResponse_VerbReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/VerbReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[VerbReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_WorkspaceChatConversationReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceChatConversationReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[WorkspaceChatConversationReadSchema]",
        "type": "object"
      },
      "PaginatedResponse_WorkspaceChatMessageReadSchema_": {
        "properties": {
          "data": {
            "description": "The list of ResponseItems.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceChatMessageReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "next_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the next page. If there are no more pages, this is None."
          },
          "previous_page_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cursor to the previous page. If there are no previous pages, this is None."
          }
        },
        "title": "PaginatedResponse[WorkspaceChatMessageReadSchema]",
        "type": "object"
      },
      "PastedKind": {
        "description": "What a pasted list turned out to hold, so the transcript can say \"128 domains\".\n\nThe composer works this out from the entries before sending; the server\nworks it out again from the stored entries when the transcript is read,\nwith the same rule, so the card a person saw before pressing Enter is the\ncard the conversation keeps. ``ENTRIES`` is a list of nothing in\nparticular, which still counts.",
        "enum": [
          "domains",
          "emails",
          "names",
          "entries"
        ],
        "title": "PastedKind",
        "type": "string"
      },
      "PaymentMethodReadSchema": {
        "description": "Displayable summary of the organization's default payment card.",
        "properties": {
          "brand": {
            "description": "The card brand, e.g. 'visa'.",
            "title": "Brand",
            "type": "string"
          },
          "exp_month": {
            "description": "The card expiry month (1-12).",
            "title": "Exp Month",
            "type": "integer"
          },
          "exp_year": {
            "description": "The four-digit card expiry year.",
            "title": "Exp Year",
            "type": "integer"
          },
          "last4": {
            "description": "The last four digits of the card number.",
            "title": "Last4",
            "type": "string"
          }
        },
        "required": [
          "brand",
          "last4",
          "exp_month",
          "exp_year"
        ],
        "title": "PaymentMethodReadSchema",
        "type": "object"
      },
      "PaymentRequiredResponse": {
        "properties": {
          "detail": {
            "description": "The detail of why payment is required.",
            "title": "Detail",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "title": "PaymentRequiredResponse",
        "type": "object"
      },
      "PeopleQuerySchema": {
        "description": "Filters for a people search.",
        "properties": {
          "active_profile_only": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Excludes profiles the index has deleted or hidden."
          },
          "certifications": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A certification they hold, matched on its name or its issuer."
          },
          "cities": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cities the person lives in."
          },
          "company_cities": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cities the current employer's headquarters are in."
          },
          "company_countries": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Countries the current employer's headquarters are in, written out in full, as in United States."
          },
          "company_founded": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The year their current employer was founded."
          },
          "company_funded_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only people whose employer last raised on or after this day, as YYYY-MM-DD.",
            "title": "Company Funded After"
          },
          "company_funding_amount": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The size of their current employer's last round, in US dollars."
          },
          "company_headcount": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their current employer's employee count."
          },
          "company_headcount_growth": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GrowthFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Headcount change at their current employer over a window, as a percentage band."
          },
          "company_headcount_growth_percent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Yearly headcount change at the current employer, as a percentage. Replaces the growth filter with a timespan, which this search cannot narrow by."
          },
          "company_identifier": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their current employer, as domains, LinkedIn company URLs or numeric LinkedIn ids, mixed freely."
          },
          "company_industry": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The current employer's industry, from the lead database's fixed industry list. Matched case-insensitively; a value outside the list is refused and the nearest entry is named."
          },
          "company_is_b2b": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether their current employer sells to businesses, by the index's own reading."
          },
          "company_keyword": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words in the categories and keywords filed on their current employer."
          },
          "company_location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Retired: use company_countries. Still accepted, and its values are searched as company_countries (the country of the current employer's headquarters, spelled as the country list spells it), so older saved searches and callers keep working."
          },
          "company_name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their current employer's name, the brand it goes by."
          },
          "company_revenue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their current employer's annual revenue, in US dollars. An estimate many companies lack, so it narrows hard."
          },
          "company_size_bands": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their employer's headcount as a band, one of: Myself Only, 1-10 employees, 11-50 employees, 51-200 employees, 201-500 employees, 501-1000 employees, 1001-5000 employees, 5001-10,000 employees or 10,001+ employees. Offered beside the numeric headcount because each reaches companies the other does not."
          },
          "company_states": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "States or provinces the current employer's headquarters are in, written out in full."
          },
          "company_table": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyTableFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their current employer is one of the companies in a column of one of your tables, or is not. The column is read again every time the search counts, previews or runs, so the search follows the table as it changes. Its companies join company_identifier on the same side."
          },
          "company_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The current employer's type, one of: Privately Held, Public Company, Self-Employed, Self-Owned, Partnership, Nonprofit, Educational or Government Agency. Matched case-insensitively; any other spelling is refused rather than quietly matching nothing."
          },
          "company_website": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their current employer's website domain, as stripe.com."
          },
          "connections": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many connections their professional profile has."
          },
          "countries": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Countries the person lives in, written out in full. Without profile_location, countries, states and cities narrow one another, so United States, California and San Francisco together ask for San Francisco."
          },
          "degree": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What they studied: the subject of a degree, as their profile writes it."
          },
          "departments": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Departments, one of: Administrative, C-Suite, Consulting, Customer Service, Design, Education, Engineering and Technical, Finance & Accounting, General Management, Human Resources, Legal, Marketing, Medical, Operations, Other, Product, Project Management, Real Estate, Research, Sales or Trades. The index stores these whole, so a value outside the list is refused rather than quietly matching nothing."
          },
          "excluded_people": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/PreviewPickSchema"
                },
                "maxItems": 100,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "People left out one by one, each a row ticked in a preview of a people search, by the ref the preview gave it (`row_refs`). The refs are kept for as long as the workspace is; a search naming one the workspace does not keep is refused.",
            "title": "Excluded People"
          },
          "first_name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The person's first name, as their profile spells it."
          },
          "followers": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many followers their professional profile has."
          },
          "graduated": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Graduation YEAR, as a range. The index stores a year, not a date."
          },
          "is_decision_maker": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether they make buying decisions, by the index's own reading."
          },
          "is_working": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FlagFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether they are employed now, by the index's own reading."
          },
          "job_title": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The title of the job they hold now, matched as a phrase and as its common spellings: & and and, SVP and Senior Vice President, VP and Vice President, AVP, EVP, Sr. and Senior. Several values are alternatives, so send each other way a role is worded, such as an acronym and the words it stands for."
          },
          "keyword": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words in their profile headline."
          },
          "language_proficiency": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How well they speak a language they list, beside the language itself."
          },
          "languages": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Languages they speak, written out in English, as in Spanish."
          },
          "last_name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The person's last name, as their profile spells it."
          },
          "left_company_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only people who left a past role on or after this day, as YYYY-MM-DD.",
            "title": "Left Company After"
          },
          "left_company_before": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only people who left a past role on or before this day, as YYYY-MM-DD.",
            "title": "Left Company Before"
          },
          "location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The older name for profile_location, read only when profile_location is not set. Prefer profile_location."
          },
          "management_levels": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Seniority, one of: C-Level, Director, Founder, Head, Intern, Manager, Owner, Partner, President/Vice President, Senior, Specialist or Vice President. Refused the same way as departments. President/Vice President is the rung the index fills; Vice President is kept but reaches almost nobody."
          },
          "past_company_cities": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cities a previous employer's headquarters are in, for the same past role."
          },
          "past_company_countries": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Countries a previous employer's headquarters are in. Every past filter describes the same past role, so with past_job_title this asks for that title at an employer there."
          },
          "past_company_headcount": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A previous employer's employee count."
          },
          "past_company_headcount_growth": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GrowthFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Headcount change at a previous employer over a window, as a percentage band."
          },
          "past_company_identifier": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A previous employer, as domains, LinkedIn company URLs or numeric LinkedIn ids."
          },
          "past_company_industry": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A previous employer's industry, from the same fixed list as company_industry. Combined with the current-employer filters, not offered as an alternative to them."
          },
          "past_company_keyword": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words in the categories and keywords filed on a previous employer."
          },
          "past_company_location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Retired: use past_company_countries. Still accepted, and its values are searched as past_company_countries."
          },
          "past_company_name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A previous employer's name. Every past filter describes the same past role."
          },
          "past_company_revenue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A previous employer's annual revenue, in US dollars."
          },
          "past_company_states": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "States or provinces a previous employer's headquarters are in, written out in full, for the same past role."
          },
          "past_company_table": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyTableFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A previous employer is one of the companies in a column of one of your tables, or is not; read the same way as company_table. Its companies join past_company_identifier."
          },
          "past_company_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A previous employer's type, from the same eight values as company_type."
          },
          "past_company_website": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A previous employer's website domain, as stripe.com."
          },
          "past_departments": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Departments of a role they used to hold, from the same list as departments."
          },
          "past_job_title": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The title of a job they held before, matched as job_title is. Every past filter describes the same past role."
          },
          "past_management_levels": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Seniority of a role they used to hold, from the same list as management_levels, refused the same way."
          },
          "profile_location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the person lives, whatever the location of their job, as a list of places that are alternatives to one another. A place is a country written out in full, a state or province, or a city; a comma narrows a city to its country, as in Paris, France. When this is set, countries, states and cities are read as more places in the same list rather than narrowing it."
          },
          "recommendations": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many recommendations their profile carries."
          },
          "school": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Schools they studied at."
          },
          "skills": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Skills listed on their profile."
          },
          "started_current_role_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only people who started the job they hold now on or after this day.",
            "title": "Started Current Role After"
          },
          "states": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "States or provinces the person lives in, written out in full."
          },
          "total_experience_months": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whole career length in MONTHS. `years_of_experience` asks the same question in years; setting both narrows to the overlap."
          },
          "work_location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TextFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the current job is based, matched as it is written on the profile. Values are sent as typed."
          },
          "years_in_current_company": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How long they have held the job they have now, in YEARS."
          },
          "years_in_past_company": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "How long they stayed in a past role, in YEARS."
          },
          "years_of_experience": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whole career length, in YEARS."
          }
        },
        "title": "PeopleQuerySchema",
        "type": "object"
      },
      "PointGoesTo": {
        "description": "Where one point of a session's notes belongs (F7).",
        "enum": [
          "rule",
          "this_message",
          "instruction",
          "link",
          "fact",
          "sender",
          "research",
          "pending"
        ],
        "title": "PointGoesTo",
        "type": "string"
      },
      "PointingRowReadSchema": {
        "description": "One row of another table that points at a row here.",
        "properties": {
          "label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the row is listed by; null when it has nothing.",
            "title": "Label"
          },
          "record_id": {
            "description": "The row of the other table.",
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          }
        },
        "required": [
          "record_id",
          "label"
        ],
        "title": "PointingRowReadSchema",
        "type": "object"
      },
      "PostAuthorsQuerySchema": {
        "description": "Filters for a search for people whose own LinkedIn posts carry a phrase.\n\nThe rows are people, one per author, each carrying every matching post the\nsearch read for them. The count is of posts, since the people are folded\nfrom them once they are read.",
        "properties": {
          "and_keywords": {
            "anyOf": [
              {
                "items": {
                  "items": {
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "maxItems": 20,
                  "type": "array"
                },
                "maxItems": 4,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Up to 4 more groups of phrases, each of which a post must ALSO carry one phrase of, with up to 20 phrases to include across keywords and every group. Each is matched the same way: keywords clay with one group expensive, credits, cost finds posts that mention clay and any of the three. Groups only narrow a search: keywords must hold a phrase too.",
            "title": "And Keywords"
          },
          "in_comments": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Also look for each phrase in the comments under the post. The row is still the post's author, never the commenter. Only with search.",
            "title": "In Comments"
          },
          "in_posts": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Look for each phrase in the author's own post, its hashtags and the people tagged in it. On unless set to false; false searches only the places in_reshares and in_comments turn on, and then a tag (@Acme) finds nothing and is refused. Only with search.",
            "title": "In Posts"
          },
          "in_reshares": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Also look for each phrase in the post the author reshared, and its hashtags. Only with search.",
            "title": "In Reshares"
          },
          "keywords": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PostPhraseFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Phrases a post must carry, any of them, and phrases that rule a post out, up to 20 to include across keywords and every group, and 20 to exclude. A phrase is matched whole and in order in the text the author wrote: revenue operations matches a post about revenue operations and not one about operations revenue. Punctuation between the words does not break a match, and no other form of a word does: cost does not match costs. At least one phrase in keywords is required unless search is written instead; groups only narrow it."
          },
          "min_comments": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Skip posts with fewer comments than this.",
            "title": "Min Comments"
          },
          "min_reactions": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Skip posts fewer people reacted to than this.",
            "title": "Min Reactions"
          },
          "posted_within": {
            "$ref": "#/components/schemas/PostWindow",
            "default": "past_month",
            "description": "How recently the post went up, counted back from the day the search runs, so a saved or scheduled search keeps reading the latest posts. The past month by default. Posts reach the index about a week after they go up."
          },
          "search": {
            "anyOf": [
              {
                "maxLength": 4000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The whole search written the way LinkedIn's own search box takes one, in place of keywords and and_keywords: (clay OR apollo) AND (pricing OR cost) NOT (hiring AND remote). AND, OR, and NOT in capitals are the operators, brackets group them, and NOT at the end leaves posts out. Words side by side are one phrase, matched whole and in order; quotes make plain words of anything, an operator word, #, @, or * included. NEAR(clay, pricing) holds phrases within a few words of each other and ATLEAST2(pricing, budget, renewal) asks for any two. #revops is a hashtag, @Acme a person or company tagged in the post, and pric* every word starting with pric (one word, 3 letters or more before the star). Up to 40 different phrases.",
            "title": "Search"
          },
          "word_endings": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Also match the other common endings of each phrase's last word: cost finds costs, costing and costed. A NEAR( line matches its words as written. Off unless set. Only with search.",
            "title": "Word Endings"
          }
        },
        "title": "PostAuthorsQuerySchema",
        "type": "object"
      },
      "PostKind": {
        "description": "What kind of Hacker News post a listing came from.",
        "enum": [
          "show_hn",
          "launch_hn",
          "hiring"
        ],
        "title": "PostKind",
        "type": "string"
      },
      "PostPhraseFilterSchema": {
        "description": "A phrase filter over the text of LinkedIn posts, capped at twenty phrases each way.",
        "properties": {
          "exclude": {
            "items": {
              "maxLength": 200,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 20,
            "title": "Exclude",
            "type": "array"
          },
          "include": {
            "items": {
              "maxLength": 200,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 20,
            "title": "Include",
            "type": "array"
          }
        },
        "title": "PostPhraseFilterSchema",
        "type": "object"
      },
      "PostWindow": {
        "description": "How recently a post went up for a posts search to read it, counted back from the run.\n\n``any_time`` is a member rather than a null: a stored query drops its\nnulls, and a null would come back from storage as the default window.",
        "enum": [
          "past_week",
          "past_month",
          "past_quarter",
          "past_year",
          "any_time"
        ],
        "title": "PostWindow",
        "type": "string"
      },
      "PreflightIssueReadSchema": {
        "properties": {
          "blocking": {
            "default": true,
            "description": "False for a finding worth a look that does not stop the launch. The launch gate ignores these; the dialog lists them after the to-dos, with the same Fix link.",
            "title": "Blocking",
            "type": "boolean"
          },
          "code": {
            "title": "Code",
            "type": "string"
          },
          "count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The number a finding is about, for the codes that carry one: `contacts_missing_email` carries how many audience contacts have no email that a Find work email lookup has not tried yet, `emails_not_verified` how many audience addresses have not been verified yet, and `spam_check` how many things the spam check found in the email `step_id` names, one row per email. Read this rather than a number in `message`. Null for every other code.",
            "title": "Count"
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step this problem is about, so the banner can select and scroll to its card. Never named in `message`, because an id is not how a customer knows a step. Null when the problem belongs to the sequence, not one step.",
            "title": "Step Id"
          },
          "tab": {
            "description": "Which tab of the sequence editor fixes this problem: `builder`, `agent` (the writing settings on the Builder tab), `audience`, `settings`, `senders` or `delivery`. `senders` (the senders) and `delivery` (the spending limit) both mean sections of the Settings tab; they keep the names of tabs that folded into it, so a client that reads them keeps working.",
            "title": "Tab",
            "type": "string"
          }
        },
        "required": [
          "tab",
          "code",
          "message"
        ],
        "title": "PreflightIssueReadSchema",
        "type": "object"
      },
      "PreflightStatus": {
        "description": "Outcome of the pre-flight resolve check for a hand-typed tenant workspace.",
        "enum": [
          "found",
          "not_found",
          "unreachable"
        ],
        "title": "PreflightStatus",
        "type": "string"
      },
      "PreparedColumnSchema": {
        "description": "The column a card created before anybody decided it.\n\nAdding a column and running it are one decision: the column lands the\nmoment the card appears, so the person can open it and see what they are\nbeing asked to pay for, and the card quotes the run alone. Dismissing the\ncard removes the column again.",
        "properties": {
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column the card runs, when the card added it. Null when the card runs a column that was already on the table and added only columns that read it.",
            "title": "Column Id"
          },
          "dependent_column_ids": {
            "description": "Columns the same reply added that the run fills in after this one. Dismissing the card removes them too. Empty for most cards.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Dependent Column Ids",
            "type": "array"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "column_id"
        ],
        "title": "PreparedColumnSchema",
        "type": "object"
      },
      "PreviewComparisonContext": {
        "description": "Fingerprints of the inputs actually used, grouped for a readable comparison.",
        "properties": {
          "as_sent": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "As Sent"
          },
          "context_fingerprints": {
            "additionalProperties": {
              "type": "string"
            },
            "title": "Context Fingerprints",
            "type": "object"
          },
          "facts_offered": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Facts Offered"
          },
          "setting_fingerprints": {
            "additionalProperties": {
              "type": "string"
            },
            "title": "Setting Fingerprints",
            "type": "object"
          }
        },
        "required": [
          "context_fingerprints",
          "setting_fingerprints"
        ],
        "title": "PreviewComparisonContext",
        "type": "object"
      },
      "PreviewPickSchema": {
        "description": "One row of a search's preview, named by the ref the preview answered beside it.",
        "properties": {
          "name": {
            "default": "",
            "description": "What the row showed, so a page can name it. Never searched on.",
            "maxLength": 255,
            "title": "Name",
            "type": "string"
          },
          "ref": {
            "description": "The row's ref, from the preview's `row_refs`.",
            "pattern": "^[A-Za-z0-9_-]{12}$",
            "title": "Ref",
            "type": "string"
          }
        },
        "required": [
          "ref"
        ],
        "title": "PreviewPickSchema",
        "type": "object"
      },
      "PricePer": {
        "description": "What a card's price is the price of: one call, or each day of what the call starts.\n\nCALL is nearly every card: the most approving it may spend, once. DAY is\na card that starts (or re-arms) a standing buy that goes on spending by\nitself, adding rows every day: its price is the most one day may cost,\nsaid \"up to 145 credits a day\", and Approve all keeps it out of the\none-off total it adds up. No tool starts one today.",
        "enum": [
          "call",
          "day"
        ],
        "title": "PricePer",
        "type": "string"
      },
      "PricingModel": {
        "description": "How a product charges, where a board says.",
        "enum": [
          "free",
          "freemium",
          "paid"
        ],
        "title": "PricingModel",
        "type": "string"
      },
      "ProductCreditTierReadSchema": {
        "description": "One selectable credit volume of a product.",
        "properties": {
          "annual_price_decimal": {
            "description": "The plan's FULL annual price at this volume, in cents.",
            "title": "Annual Price Decimal",
            "type": "string"
          },
          "credits": {
            "description": "The monthly credit allowance the tier grants.",
            "title": "Credits",
            "type": "integer"
          },
          "monthly_price_decimal": {
            "description": "The plan's FULL monthly price at this volume, in cents, flat platform fee included, not an increment over any base price.",
            "title": "Monthly Price Decimal",
            "type": "string"
          },
          "tier_key": {
            "description": "The tier key, e.g. 'team_tier_20k'.",
            "title": "Tier Key",
            "type": "string"
          }
        },
        "required": [
          "tier_key",
          "credits",
          "monthly_price_decimal",
          "annual_price_decimal"
        ],
        "title": "ProductCreditTierReadSchema",
        "type": "object"
      },
      "ProductReadSchema": {
        "description": "Response schema for product information.",
        "properties": {
          "credit_tiers": {
            "description": "The selectable credit volumes, cheapest first, each carrying the plan's full price at that volume. Empty for products with no self-serve price (Free, Enterprise), which is the whole of what they cost.",
            "items": {
              "$ref": "#/components/schemas/ProductCreditTierReadSchema"
            },
            "title": "Credit Tiers",
            "type": "array"
          },
          "data_retention": {
            "description": "Data retention period.",
            "format": "duration",
            "title": "Data Retention",
            "type": "string"
          },
          "included_credits": {
            "description": "Credits included each period. For a tiered product this is the entry tier's allowance. The effective allowance comes from the selected tier.",
            "title": "Included Credits",
            "type": "integer"
          },
          "max_integrations": {
            "description": "Maximum number of integrations allowed. 0 means unlimited.",
            "title": "Max Integrations",
            "type": "integer"
          },
          "max_rows_per_table": {
            "description": "Maximum number of rows per table. 0 means unlimited.",
            "title": "Max Rows Per Table",
            "type": "integer"
          },
          "max_tables": {
            "description": "Maximum number of tables allowed. 0 means unlimited.",
            "title": "Max Tables",
            "type": "integer"
          },
          "name": {
            "description": "The product name.",
            "title": "Name",
            "type": "string"
          },
          "seats": {
            "description": "Number of seats included. 0 means unlimited.",
            "title": "Seats",
            "type": "integer"
          },
          "type": {
            "$ref": "#/components/schemas/ProductTier",
            "description": "The product type."
          }
        },
        "required": [
          "name",
          "type",
          "credit_tiers",
          "max_integrations",
          "included_credits",
          "max_tables",
          "max_rows_per_table",
          "data_retention",
          "seats"
        ],
        "title": "ProductReadSchema",
        "type": "object"
      },
      "ProductTier": {
        "description": "The tier of a product in Stripe.\n\nDeclared cheapest-first. Free and Enterprise never touch Stripe: Free is\nfree, Enterprise is sales-led and has no self-serve price.\n\nA subscription's tier is recovered from its price's ``product_tier``\nmetadata, never by reverse-parsing a Stripe product name: a product is named\nfor the plan AND the credit volume it sells (\"Team Plan (10,000 credits)\"),\nso the name has not round-tripped to a tier since prices collapsed to one\nper plan+volume.",
        "enum": [
          "free_plan",
          "team_plan",
          "pro_plan",
          "enterprise_plan"
        ],
        "title": "ProductTier",
        "type": "string"
      },
      "ProfileViewOutcome-Input": {
        "additionalProperties": false,
        "description": "What a profile view saw: the common fields and the nine profile facts.\n\nThe view IS the action: LinkedIn records it server-side the moment the page\nrenders, so ``page_loaded`` is the verification and a view whose facts all\nread ``None`` is still a completed view. How long the browser lingered and\nhow far it scrolled are the driver's pacing, not facts about the member,\nand the row's own ``duration_ms`` already says how long the step took.\n\n``profile`` is what the browser read off the profile when the step asked\n(``ProfileViewParams.read_profile``); None when it did not ask, when the\nbuild cannot read it, or when nothing was readable. It is taken off before\nthe row is written, so a stored outcome always has it None.",
        "properties": {
          "already_connected": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Connected"
          },
          "already_following": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Following"
          },
          "can_send_message": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Can Send Message"
          },
          "invitation_pending": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invitation Pending"
          },
          "kind": {
            "const": "profile_view",
            "default": "profile_view",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "member_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 8,
            "title": "Member Urns",
            "type": "array"
          },
          "open_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open Profile"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "profile": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInProfileContent"
              },
              {
                "type": "null"
              }
            ]
          },
          "profile_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Resolved"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "vanity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity"
          }
        },
        "title": "ProfileViewOutcome",
        "type": "object"
      },
      "ProfileViewOutcome-Output": {
        "additionalProperties": false,
        "description": "What a profile view saw: the common fields and the nine profile facts.\n\nThe view IS the action: LinkedIn records it server-side the moment the page\nrenders, so ``page_loaded`` is the verification and a view whose facts all\nread ``None`` is still a completed view. How long the browser lingered and\nhow far it scrolled are the driver's pacing, not facts about the member,\nand the row's own ``duration_ms`` already says how long the step took.\n\n``profile`` is what the browser read off the profile when the step asked\n(``ProfileViewParams.read_profile``); None when it did not ask, when the\nbuild cannot read it, or when nothing was readable. It is taken off before\nthe row is written, so a stored outcome always has it None.",
        "properties": {
          "already_connected": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Connected"
          },
          "already_following": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Following"
          },
          "can_send_message": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Can Send Message"
          },
          "invitation_pending": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invitation Pending"
          },
          "kind": {
            "const": "profile_view",
            "default": "profile_view",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "member_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 8,
            "title": "Member Urns",
            "type": "array"
          },
          "open_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open Profile"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "profile": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInProfileContent"
              },
              {
                "type": "null"
              }
            ]
          },
          "profile_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Resolved"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "vanity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity"
          }
        },
        "title": "ProfileViewOutcome",
        "type": "object"
      },
      "ProfileViewParams": {
        "additionalProperties": false,
        "description": "Open a member's profile and read it like a person would. The navigation is the action.\n\n``profile_url`` is where the browser goes first. ``read_relationship`` asks\nthe browser to settle whether the member is connected or has our invitation\npending even where the action bar does not show it, by opening the member's\nown More menu and reading it: the look a connection request queues when its\nanswer cannot be told any other way. ``read_profile`` asks the browser to\nread the member's profile content and hand it back on the result; a build\nthat does not report ``READ_PROFILE_CAPABILITY`` runs a plain view instead.",
        "properties": {
          "kind": {
            "const": "profile_view",
            "default": "profile_view",
            "title": "Kind",
            "type": "string"
          },
          "profile_url": {
            "maxLength": 512,
            "title": "Profile Url",
            "type": "string"
          },
          "read_profile": {
            "default": false,
            "title": "Read Profile",
            "type": "boolean"
          },
          "read_relationship": {
            "default": false,
            "title": "Read Relationship",
            "type": "boolean"
          }
        },
        "required": [
          "profile_url"
        ],
        "title": "ProfileViewParams",
        "type": "object"
      },
      "PromoteSourceFieldRequestSchema": {
        "description": "Which field to give its own column.",
        "properties": {
          "display_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Column name.",
            "title": "Display Name"
          },
          "path": {
            "description": "Dotted path into the object.",
            "maxLength": 500,
            "minLength": 1,
            "title": "Path",
            "type": "string"
          },
          "property_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PropertyType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Type to store; inferred from the sample when omitted."
          }
        },
        "required": [
          "path"
        ],
        "title": "PromoteSourceFieldRequestSchema",
        "type": "object"
      },
      "PromoteSourceFieldResponseSchema": {
        "description": "The column that now reads the field.",
        "properties": {
          "column_id": {
            "description": "The new column's id. On a dry run, the id the column would have been given; no column is made, so nothing answers to it.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          }
        },
        "required": [
          "column_id"
        ],
        "title": "PromoteSourceFieldResponseSchema",
        "type": "object"
      },
      "PropertyKind": {
        "description": "Mode of a property. Used while creating/updating/deleting properties.\n\nAttributes:\n    BUILTIN: The property is a built-in property. E.g. \"$created_at\" or \"$email\" for PostHog.\n    CUSTOM: The property is a custom property. E.g. \"custom_property\" for PostHog.\n            Unknown properties are marked as CUSTOM.",
        "enum": [
          "builtin",
          "custom"
        ],
        "title": "PropertyKind",
        "type": "string"
      },
      "PropertyReadSchema": {
        "description": "Response model for a single property.",
        "properties": {
          "label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The tool's own display name for the property (HubSpot's 'Record ID' for hs_object_id), for showing to people. Null when the tool exposes none; `name` stays the key every read and write uses.",
            "title": "Label"
          },
          "mode": {
            "$ref": "#/components/schemas/PropertyKind",
            "description": "Property mode: builtin or custom"
          },
          "name": {
            "description": "The name of the property",
            "title": "Name",
            "type": "string"
          },
          "read_only": {
            "description": "Whether the property is read-only and cannot be used as a destination field",
            "title": "Read Only",
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/PropertyType",
            "description": "The type of the property"
          }
        },
        "required": [
          "name",
          "type",
          "mode",
          "read_only"
        ],
        "title": "PropertyReadSchema",
        "type": "object"
      },
      "PropertyType": {
        "description": "Type of a property. Used while creating/updating/deleting properties.",
        "enum": [
          "string",
          "integer",
          "float",
          "boolean",
          "datetime",
          "date",
          "list",
          "dict"
        ],
        "title": "PropertyType",
        "type": "string"
      },
      "ProposalChangeRequestCreateSchema": {
        "description": "A change of a proposed learning's words or who it applies to, in the background.",
        "properties": {
          "event_id": {
            "description": "The proposed learning's thumbs down.",
            "format": "uuid",
            "title": "Event Id",
            "type": "string"
          },
          "kind": {
            "const": "proposal_change",
            "description": "A change, as `PATCH /agent-learnings/thumbs-downs/{event_id}/proposal/` makes it.",
            "title": "Kind",
            "type": "string"
          },
          "request_id": {
            "description": "The client's key for this change: sent again (a double click, a retry), it answers the same one.",
            "format": "uuid",
            "title": "Request Id",
            "type": "string"
          },
          "scope": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposedScope"
              },
              {
                "type": "null"
              }
            ],
            "description": "`sequence` or `account`. Switching a learning that names one step to `account` rewords it to name none."
          },
          "text": {
            "anyOf": [
              {
                "maxLength": 300,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The person's own words for it.",
            "title": "Text"
          }
        },
        "required": [
          "kind",
          "event_id",
          "request_id"
        ],
        "title": "ProposalChangeRequestCreateSchema",
        "type": "object"
      },
      "ProposalCommitSchema": {
        "description": "Save a feedback session's changes as the person saw them.",
        "properties": {
          "rev": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The session's `rev` as read. When sent, a set a note or an edit changed since is refused (409) and nothing is saved; left out, the set is saved as it stands.",
            "title": "Rev"
          }
        },
        "title": "ProposalCommitSchema",
        "type": "object"
      },
      "ProposalDetailSchema": {
        "description": "The body of a card: what to read under the summary before approving.\n\n``kind`` says how to draw it. ``text`` is a block to read; ``diff`` is a\nbefore and an after to compare, which is how a prompt or an email being\nrewritten is shown, so nobody approves a rewrite they have not seen.\n\nA card about a lead search also carries the search: under a ``text``\ncard's text, or as the first lines of a ``diff``'s before and after. The\ntext then holds only what is not a filter.",
        "properties": {
          "after": {
            "default": "",
            "description": "What it would say, for a diff.",
            "title": "After",
            "type": "string"
          },
          "before": {
            "default": "",
            "description": "What it says now, for a diff.",
            "title": "Before",
            "type": "string"
          },
          "kind": {
            "enum": [
              "text",
              "diff"
            ],
            "title": "Kind",
            "type": "string"
          },
          "landing": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CardLandingSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table a lead search would make, for a card that makes one."
          },
          "search": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CardSearchSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The lead search whose filters the card lists, or the search after a diff."
          },
          "search_before": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CardSearchSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The lead search as it stands, for a diff that changes one."
          },
          "text": {
            "default": "",
            "description": "The body, for a text card.",
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "kind"
        ],
        "title": "ProposalDetailSchema",
        "type": "object"
      },
      "ProposalKind": {
        "description": "How an approved card is carried out.\n\nVERB is F-15's eight hand-written workspace verbs: each has a spec in the\nregistry with its own apply, because applying one is real work rather than\na single request.\n\nTOOL is any route the assistant may call. An approval re-issues the request\nthe model asked for, through the same executor an MCP client would use, so\nthere is nothing to write per route and nothing to keep in step.",
        "enum": [
          "verb",
          "tool"
        ],
        "title": "ProposalKind",
        "type": "string"
      },
      "ProposalOrigin": {
        "description": "Which surface raised a proposal.\n\nKept as its own enum rather than reusing the thread-store origins: a\nscheduled search proposes with no conversation behind it at all, and the\nactivity feed needs to say so.",
        "enum": [
          "chat",
          "agent",
          "scheduled_search",
          "table_assistant"
        ],
        "title": "ProposalOrigin",
        "type": "string"
      },
      "ProposalPointReadSchema": {
        "description": "One thing a feedback session's notes ask for, as its learner read them.",
        "properties": {
          "covered": {
            "description": "Whether a change learns it.",
            "title": "Covered",
            "type": "boolean"
          },
          "goes_to": {
            "$ref": "#/components/schemas/PointGoesTo",
            "description": "Where it belongs: `rule` (a learning), `this_message` (only this message: the rewrite follows it, nothing is kept), `instruction` (a step's or the reply's instruction), `link` (the sequence's call-to-action link), `fact` (the business Q&A), `sender` (a sender's own setting, changed on Senders) or `research` (the sequence's research settings). `sender` and `research` are never written."
          },
          "note": {
            "description": "The note it is in, from 1, oldest first (see `notes`).",
            "title": "Note",
            "type": "integer"
          },
          "number": {
            "description": "From 1, across every note: what a change's `points` name.",
            "title": "Number",
            "type": "integer"
          },
          "quote": {
            "description": "The note's own words for it; empty when the learner's quote was not found.",
            "title": "Quote",
            "type": "string"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why it is not learned (it names this contact, say); null when it is.",
            "title": "Reason"
          },
          "said": {
            "description": "The point in a few words.",
            "title": "Said",
            "type": "string"
          }
        },
        "required": [
          "number",
          "note",
          "quote",
          "said",
          "covered",
          "reason",
          "goes_to"
        ],
        "title": "ProposalPointReadSchema",
        "type": "object"
      },
      "ProposalReadSchema": {
        "description": "What a feedback session will learn, before a person saves it.\n\nSaved by Save (POST .../save/), by approving the rewritten task or reply, or by Looks\ngood on the rewritten Preview contact, the cells or the Preview example; thrown away by\nUndo, a rejection or a discard. A table agent's changes are its own, at `sequence` scope.\n`changes` lists every change; the fields beside it describe the first add or rewrite.",
        "properties": {
          "auto_rewrites": {
            "description": "How many messages written ahead (Tasks cards, messages waiting to send on their own, and waiting reply drafts) were written again once it was saved.",
            "title": "Auto Rewrites",
            "type": "integer"
          },
          "changes": {
            "description": "Every change it makes to the learnings, in the learner's order.",
            "items": {
              "$ref": "#/components/schemas/ProposedChangeReadSchema"
            },
            "title": "Changes",
            "type": "array"
          },
          "learn_detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why it failed, said on the card; null when ok.",
            "title": "Learn Detail"
          },
          "learn_state": {
            "$ref": "#/components/schemas/LearnState",
            "description": "`ok`, or `failed` when the learner could not work out what to learn from the last note: nothing new is learned until Retry, and the changes before it stand."
          },
          "moved_from_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Once saved for every sequence: this sequence's learning it took the place of, which Undo puts back.",
            "title": "Moved From Text"
          },
          "points": {
            "description": "What the notes ask for, as its learner read them; each change names its own. Empty once the session closed: they go with its notes.",
            "items": {
              "$ref": "#/components/schemas/ProposalPointReadSchema"
            },
            "title": "Points",
            "type": "array"
          },
          "replaces_scope": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposedScope"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whose learning the first change rewrites: this sequence's, or every sequence's. A rewrite of every sequence's learning kept at `sequence` scope saves a new learning for this sequence instead (Replaces in this sequence)."
          },
          "replaces_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The saved learning the first change rewrites, as it read when proposed (Replaces: ...); null when it adds one.",
            "title": "Replaces Text"
          },
          "rev": {
            "description": "The revision of `changes`: it moves on every refine or edit of them.",
            "title": "Rev",
            "type": "integer"
          },
          "saved_learning_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning the first change saved, once saved; null while it waits or once thrown away.",
            "title": "Saved Learning Id"
          },
          "scope": {
            "$ref": "#/components/schemas/ProposedScope",
            "description": "The first change's scope. `sequence`: this sequence only (the default). `account`: every sequence's writer, its emails, LinkedIn messages and replies."
          },
          "text": {
            "description": "The first change's learning as it would be saved, one line.",
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "changes",
          "rev",
          "text",
          "scope",
          "replaces_text",
          "replaces_scope",
          "saved_learning_id",
          "moved_from_text",
          "auto_rewrites",
          "points",
          "learn_state",
          "learn_detail"
        ],
        "title": "ProposalReadSchema",
        "type": "object"
      },
      "ProposalStatus": {
        "description": "Where one proposed action stands.\n\nPROPOSED waits on a person. APPLIED happened. DISMISSED is a person saying\nno. FAILED is an approval whose apply raised; the error stays with the row\nso the card can say why instead of vanishing.\n\nUNDONE is HISTORY ONLY. Nothing reaches it any more: undo was taken out\nwhile the assistant moved from eight hand-written verbs to any route it\nmay call, because reversing an arbitrary write is per-route work nobody\nhas done yet. The member stays because rows in this state were written\nbefore that, and a status the code cannot read is an activity feed that\nraises instead of loading.",
        "enum": [
          "proposed",
          "applied",
          "undone",
          "dismissed",
          "failed"
        ],
        "title": "ProposalStatus",
        "type": "string"
      },
      "ProposalUpdateSchema": {
        "description": "Change a proposed learning's words or scope before it is saved.",
        "properties": {
          "scope": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposedScope"
              },
              {
                "type": "null"
              }
            ],
            "description": "`sequence` or `account`. Switching a learning that names one step to `account` rewords it to name none."
          },
          "text": {
            "anyOf": [
              {
                "maxLength": 300,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The person's own words for it.",
            "title": "Text"
          }
        },
        "title": "ProposalUpdateSchema",
        "type": "object"
      },
      "ProposedChangeReadSchema": {
        "description": "One change a feedback session makes: a learning, an instruction, the link or a fact.",
        "properties": {
          "find": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "An instruction edit's words it replaces.",
            "title": "Find"
          },
          "history": {
            "description": "How it read before later notes rewrote it, oldest first.",
            "items": {
              "$ref": "#/components/schemas/ChangeVersionReadSchema"
            },
            "title": "History",
            "type": "array"
          },
          "id": {
            "description": "Stable within its session: `c1`, `c2`...",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ChangeKind",
            "description": "`add` a learning, `update` (rewrite) one, `delete` one, or `keep` one that already says what a point asks (nothing is written); `instruction`: edit a step's or the reply's instruction (`find` becomes `replace_with`); `link`: the sequence's call-to-action link becomes `text`; `fact`: keep `question` and its answer `text` in the business Q&A."
          },
          "note": {
            "description": "The note of the session (`thread[].number`) that last made or rewrote it; 0 for one made before notes were threaded.",
            "title": "Note",
            "type": "integer"
          },
          "off": {
            "description": "A person left it out: the page's yes saves every change still on, never this one.",
            "title": "Off",
            "type": "boolean"
          },
          "outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ChangeOutcome"
              },
              {
                "type": "null"
              }
            ],
            "description": "Null while it waits. Once saved: `applied`, `skipped_full` (its list was full) or `skipped_changed` (what it changes was edited meanwhile); an instruction, link or fact is `pending` until written, a moment after the save. Once undone: `undo_pending`, then `undone`, or `left` when it was changed since."
          },
          "points": {
            "description": "The numbers of the points it learns (`points`).",
            "items": {
              "type": "integer"
            },
            "title": "Points",
            "type": "array"
          },
          "question": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A fact's question.",
            "title": "Question"
          },
          "replace_with": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What an instruction edit puts in their place; empty removes them.",
            "title": "Replace With"
          },
          "replaces_scope": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposedScope"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whose learning it rewrites: this sequence's, or every sequence's."
          },
          "replaces_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The saved learning it rewrites or deletes, as it read when proposed; null for an add.",
            "title": "Replaces Text"
          },
          "saved_learning_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning it saved, once applied; null for a delete or while it waits.",
            "title": "Saved Learning Id"
          },
          "scope": {
            "$ref": "#/components/schemas/ProposedScope",
            "description": "`sequence`: this sequence only. `account`: every sequence's writer. For a delete, whose learning goes."
          },
          "step_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "An instruction edit's step, e.g. \"Step 2 \u00b7 Follow up\", or \"Replies\"; for an add or an update, the one step the learning holds for, null for every message.",
            "title": "Step Label"
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning as it would read; a link change's new link; a fact's answer. Null for a delete, a keep or an instruction edit.",
            "title": "Text"
          },
          "words": {
            "description": "How many words its learning has (a learning aims at 5 to 10); 0 for a change with no learning.",
            "title": "Words",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "kind",
          "text",
          "step_label",
          "find",
          "replace_with",
          "question",
          "scope",
          "replaces_text",
          "replaces_scope",
          "outcome",
          "saved_learning_id",
          "points",
          "note",
          "off",
          "history",
          "words"
        ],
        "title": "ProposedChangeReadSchema",
        "type": "object"
      },
      "ProposedScope": {
        "description": "Which writers a proposed learning reaches once saved.",
        "enum": [
          "sequence",
          "account"
        ],
        "title": "ProposedScope",
        "type": "string"
      },
      "ProviderCredentials": {
        "description": "Whose account an enrichment action's calls are billed to.\n\nLives here because it crosses the package boundary: the API layer renders\nit on every action, and `api` may read a domain's types but never its\ninternals.",
        "enum": [
          "platform",
          "customer"
        ],
        "title": "ProviderCredentials",
        "type": "string"
      },
      "ProviderFailureResponseSchema": {
        "description": "A customer-safe refusal from the lead-search provider itself, not the request.\n\nEvery field here is written to be read on its own: the request was well\nformed and the filters were not the problem (see ``_as_provider_failure``,\nwhich builds this shape). Documented on the routes that raise it, so a\ngeneric 5xx handler can tell this apart from an unexpected server failure\nand relay it rather than hiding it.",
        "properties": {
          "error_code": {
            "description": "Our own classification of the failure.",
            "title": "Error Code",
            "type": "string"
          },
          "filter_errors": {
            "description": "Every filter the provider complained about, in the order it named them.",
            "items": {
              "$ref": "#/components/schemas/ProviderFilterErrorSchema"
            },
            "title": "Filter Errors",
            "type": "array"
          },
          "message": {
            "description": "What went wrong, safe to show as-is.",
            "title": "Message",
            "type": "string"
          },
          "retryable": {
            "description": "Whether trying the same query again might succeed.",
            "title": "Retryable",
            "type": "boolean"
          }
        },
        "required": [
          "message",
          "error_code",
          "retryable",
          "filter_errors"
        ],
        "title": "ProviderFailureResponseSchema",
        "type": "object"
      },
      "ProviderFilterErrorSchema": {
        "description": "One provider complaint about the query, pinned to the filter it blames.",
        "properties": {
          "filter": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Our name for the filter the provider blamed, so a client can pin this complaint to the input that caused it. Null when the complaint names no filter we recognise, e.g. a whole-query refusal.",
            "title": "Filter"
          },
          "message": {
            "description": "What the provider said, safe to show as-is.",
            "title": "Message",
            "type": "string"
          }
        },
        "required": [
          "filter",
          "message"
        ],
        "title": "ProviderFilterErrorSchema",
        "type": "object"
      },
      "ProviderSettings": {
        "description": "Settings for an integration-provider enrichment action.\n\nA provider action's inputs are STRUCTURED (named fields the provider's\noperation declares: full name, company domain, \u2026), not a prompt. Each\nbinding maps one declared input name to the column whose per-row value\nfeeds it. Required inputs without a binding block the save; bound-but-empty\nrequired inputs skip the row at run time, before any provider call.",
        "properties": {
          "input_bindings": {
            "additionalProperties": {
              "format": "uuid",
              "type": "string"
            },
            "description": "Declared operation input name \u2192 source column id.",
            "maxProperties": 10,
            "minProperties": 1,
            "title": "Input Bindings",
            "type": "object"
          },
          "kind": {
            "const": "provider",
            "default": "provider",
            "title": "Kind",
            "type": "string"
          }
        },
        "required": [
          "input_bindings"
        ],
        "title": "ProviderSettings",
        "type": "object"
      },
      "PushSummarySchema": {
        "description": "What one export column has pushed, counted by outcome.",
        "properties": {
          "last_exported_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the newest push happened, or null if none ever did.",
            "title": "Last Exported At"
          },
          "outcomes": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Counts by receipt status: created, updated, pushed.",
            "title": "Outcomes",
            "type": "object"
          },
          "total": {
            "description": "Cells with a successful push on record.",
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "outcomes",
          "total",
          "last_exported_at"
        ],
        "title": "PushSummarySchema",
        "type": "object"
      },
      "PutTableLeadSearchRequestSchema": {
        "description": "The body for putting a lead search behind a table.\n\nA table with none gets this one and runs it once, appending its results\nbeneath the rows the table holds. A table that has one has its criteria\nreplaced and nothing runs. ``only`` holds the request to one of the two,\nfor a caller that read the table's state a moment before and must not do\nthe other when that state changed since.",
        "properties": {
          "backlinks": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinksQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "enrichments": {
            "description": "What to find out about the rows this adds. Each becomes its own column, and each is billed per row that comes back with an answer.",
            "items": {
              "$ref": "#/components/schemas/LeadEnrichmentOption"
            },
            "maxItems": 4,
            "title": "Enrichments",
            "type": "array"
          },
          "hiring_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HiringCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "include_people_already_in_tables": {
            "default": false,
            "description": "A people search only. By default it leaves out the people who already have a row in one of the workspace's other tables, and keeps looking until enough new people are added; the response says how many it skipped. Set true to add them again.",
            "title": "Include People Already In Tables",
            "type": "boolean"
          },
          "local_businesses": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LocalBusinessQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "lookalikes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LookalikeQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "only": {
            "anyOf": [
              {
                "enum": [
                  "attach",
                  "replace"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hold the request to one of its two effects. `attach` puts the search behind a table that has none and runs it, and answers 409 when the table has one. `replace` changes the criteria of the search the table has, and answers 404 when it has none, so nothing runs and nothing is charged. Leave it out to do whichever fits.",
            "title": "Only"
          },
          "people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "post_authors": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PostAuthorsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "row_limit": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rows to add. Clamped further by the organisation's plan cap; omit for the maximum.",
            "title": "Row Limit"
          },
          "search_results": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SearchResultsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalPeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "startup_launches": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StartupLaunchesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "record_type"
        ],
        "title": "PutTableLeadSearchRequestSchema",
        "type": "object"
      },
      "QaVia": {
        "description": "How a Q&A entry's answer, as it stands, was written (G5/G6, 2026-10-19).\n\nA person on the dashboard, an AI assistant working for one (the in-product Assistant\nor an MCP client), or an API key with nobody behind it.",
        "enum": [
          "person",
          "assistant",
          "api"
        ],
        "title": "QaVia",
        "type": "string"
      },
      "QuestionAnswerSchema": {
        "description": "A person's answer to one of the agent's questions on a reply.",
        "properties": {
          "answer": {
            "description": "The answer, as the reply may state it.",
            "maxLength": 2000,
            "minLength": 1,
            "title": "Answer",
            "type": "string"
          },
          "question": {
            "anyOf": [
              {
                "maxLength": 300,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The question as the person reworded it; null keeps the agent's words.",
            "title": "Question"
          },
          "question_id": {
            "description": "The question's id, from the conversation's `question_card`.",
            "maxLength": 16,
            "minLength": 1,
            "title": "Question Id",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/AnswerScope",
            "default": "sequence",
            "description": "`sequence`, the default as on the card, saves the answer to the Q&A for the reply's sequence, which every later reply that sequence's agent writes reads; `account` saves it for every sequence; `this_reply` keeps it for this conversation alone, so every later reply in it has it and none elsewhere. A saved answer that names the contact, or that the Q&A will not take, is kept for this conversation instead, and the response's `not_saved` says why."
          }
        },
        "required": [
          "question_id",
          "answer"
        ],
        "title": "QuestionAnswerSchema",
        "type": "object"
      },
      "QuoteReadSchema": {
        "description": "What the redo a thumbs down would run costs (C22).",
        "properties": {
          "can_run": {
            "description": "Whether the workspace can pay for it now.",
            "title": "Can Run",
            "type": "boolean"
          },
          "credits": {
            "description": "The redo's price in credits, to the tenth; 0 where nothing is redone.",
            "title": "Credits",
            "type": "number"
          },
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why it can't run, as the screen shows it.",
            "title": "Detail"
          },
          "usual": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "What such a redo usually costs, in credits to the tenth: below `credits` for a run charged by use, equal to it for a flat price; null where no usual figure is known.",
            "title": "Usual"
          }
        },
        "required": [
          "credits",
          "can_run",
          "detail"
        ],
        "title": "QuoteReadSchema",
        "type": "object"
      },
      "RangeFilterSchema": {
        "description": "An inclusive numeric range; either bound may be omitted.",
        "properties": {
          "gte": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gte"
          },
          "lte": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lte"
          }
        },
        "title": "RangeFilterSchema",
        "type": "object"
      },
      "RankScale": {
        "description": "The scale the three rank figures are reported and filtered on.\n\n``one_hundred`` is our default and not the vendor's (``one_thousand``):\na rank out of 100 is what every other backlink tool prints, and a filter\ntyped as \"domain rank 30 and up\" means 30 out of 100 to whoever types it.\nThe scale applies to the filters as well as the rows, so a stored search\nkeeps the scale it was written on.",
        "enum": [
          "one_hundred",
          "one_thousand"
        ],
        "title": "RankScale",
        "type": "string"
      },
      "RateDraftSchema": {
        "description": "A thumb, not a scale: good or bad is all the loop needs.",
        "properties": {
          "rating": {
            "$ref": "#/components/schemas/DraftRating"
          }
        },
        "required": [
          "rating"
        ],
        "title": "RateDraftSchema",
        "type": "object"
      },
      "ReadConversationOutcome": {
        "additionalProperties": false,
        "description": "A full reading of one conversation, oldest message first.\n\nWhich thread this was is the step's own ``conversation_id``, on the same\nrow; the outcome does not repeat it, so there is no field a settlement\nwritten without a driver (expiry, restart, a navigation that never landed)\ncan forget. The read watermark only advances on a ``complete`` reading.",
        "properties": {
          "complete": {
            "default": false,
            "title": "Complete",
            "type": "boolean"
          },
          "kind": {
            "const": "read_conversation",
            "default": "read_conversation",
            "title": "Kind",
            "type": "string"
          },
          "messages": {
            "items": {
              "$ref": "#/components/schemas/LinkedInMessageRead"
            },
            "maxItems": 500,
            "title": "Messages",
            "type": "array"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "title": "ReadConversationOutcome",
        "type": "object"
      },
      "ReadConversationParams": {
        "additionalProperties": false,
        "description": "Housekeeping: open one thread the scan flagged and read it in full.\n\n``conversation_id`` names our own row, which is where the reading lands.\n``conversation_urn`` is LinkedIn's name for the thread and is what the\nbrowser navigates to; a scan hit with no urn is never queued, because there\nis nothing to open. It is still optional for this release only because\nstored rows could not be checked before the deploy: it becomes required\nonce a pre-deploy check shows no read_conversation row without one, and\nuntil then every consumer keeps handling None. The member's own urn is not\ncarried: it already sits on the row this id names, and neither the browser\nnor the service ever read the copy.",
        "properties": {
          "conversation_id": {
            "format": "uuid",
            "title": "Conversation Id",
            "type": "string"
          },
          "conversation_urn": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Conversation Urn"
          },
          "kind": {
            "const": "read_conversation",
            "default": "read_conversation",
            "title": "Kind",
            "type": "string"
          },
          "replies_after": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only on the read right after a message: a reply is an inbound message LinkedIn dates after this moment, the last reading of the whole inbox. The thread's older history is no reply.",
            "title": "Replies After"
          }
        },
        "required": [
          "conversation_id"
        ],
        "title": "ReadConversationParams",
        "type": "object"
      },
      "RedoReadSchema": {
        "description": "How the redo a thumbs down asked for went.",
        "properties": {
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why it was refused, as the screen shows it.",
            "title": "Detail"
          },
          "state": {
            "$ref": "#/components/schemas/RedoState",
            "description": "`none` where nothing is redone (a sent message), `started` while it runs, `written` once the new output is there, `refused` when it could not run."
          }
        },
        "required": [
          "state",
          "detail"
        ],
        "title": "RedoReadSchema",
        "type": "object"
      },
      "RedoState": {
        "description": "How the redo a thumbs down asked for went.",
        "enum": [
          "none",
          "started",
          "written",
          "refused"
        ],
        "title": "RedoState",
        "type": "string"
      },
      "ReferenceField": {
        "description": "One value a reference brings back from the row it points at.\n\nNamed and typed when it is picked and never renamed afterwards: a rename in\nthe other table would otherwise re-key every snapshot and break every\nprompt, formula and promoted column that reads the field by its name. The\ntarget column's id says which value fills it, and its type is that\ncolumn's own, whole records included.",
        "properties": {
          "field_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "default": "text"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "target_column_id": {
            "description": "The column of the other table this field reads.",
            "format": "uuid",
            "title": "Target Column Id",
            "type": "string"
          }
        },
        "required": [
          "target_column_id",
          "name"
        ],
        "title": "ReferenceField",
        "type": "object"
      },
      "ReferenceFieldChoiceReadSchema": {
        "description": "One column of another table, as a link into that table may bring it back.",
        "properties": {
          "can_match_on": {
            "description": "Whether the column holds one value, so a pair may match on it.",
            "title": "Can Match On",
            "type": "boolean"
          },
          "column_type": {
            "$ref": "#/components/schemas/TableColumnType"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "excluded_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the column cannot be a field, as the picker shows it; null when it can.",
            "title": "Excluded Reason"
          },
          "field_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnType"
              },
              {
                "type": "null"
              }
            ],
            "description": "The type the field would carry; null when it cannot be a field."
          },
          "target_column_id": {
            "description": "The other table's column.",
            "format": "uuid",
            "title": "Target Column Id",
            "type": "string"
          }
        },
        "required": [
          "target_column_id",
          "display_name",
          "column_type",
          "field_type",
          "excluded_reason",
          "can_match_on"
        ],
        "title": "ReferenceFieldChoiceReadSchema",
        "type": "object"
      },
      "ReferenceKey": {
        "description": "One pair a reference matches on: a column of this table against a column of the other.",
        "properties": {
          "source_column_id": {
            "description": "The column of THIS table whose value is matched.",
            "format": "uuid",
            "title": "Source Column Id",
            "type": "string"
          },
          "target_column_id": {
            "description": "The column of the other table it must equal.",
            "format": "uuid",
            "title": "Target Column Id",
            "type": "string"
          }
        },
        "required": [
          "source_column_id",
          "target_column_id"
        ],
        "title": "ReferenceKey",
        "type": "object"
      },
      "ReferenceKeyInputSchema": {
        "description": "One pair a link matches on: a column of this table against one of the other.",
        "properties": {
          "source_column_id": {
            "description": "The column of THIS table whose value is matched.",
            "format": "uuid",
            "title": "Source Column Id",
            "type": "string"
          },
          "target_column_id": {
            "description": "The column of the other table it must equal.",
            "format": "uuid",
            "title": "Target Column Id",
            "type": "string"
          }
        },
        "required": [
          "source_column_id",
          "target_column_id"
        ],
        "title": "ReferenceKeyInputSchema",
        "type": "object"
      },
      "ReferenceMatchPreviewRequestSchema": {
        "description": "A link as it is being set up, to see how it would match before it is saved.",
        "properties": {
          "keys": {
            "description": "The pairs to match on, tried in order.",
            "items": {
              "$ref": "#/components/schemas/ReferenceKeyInputSchema"
            },
            "maxItems": 3,
            "minItems": 1,
            "title": "Keys",
            "type": "array"
          },
          "target_table_id": {
            "description": "The table each row would point into.",
            "format": "uuid",
            "title": "Target Table Id",
            "type": "string"
          }
        },
        "required": [
          "target_table_id",
          "keys"
        ],
        "title": "ReferenceMatchPreviewRequestSchema",
        "type": "object"
      },
      "ReferenceMatchPreviewSchema": {
        "description": "How a link's pairs would match this table's first rows.",
        "properties": {
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why nothing can match as set up, in a sentence to show; null otherwise.",
            "title": "Error"
          },
          "matched": {
            "description": "Of those, the rows that would point at a row there.",
            "title": "Matched",
            "type": "integer"
          },
          "rows_read": {
            "description": "The rows of this table read, from the top.",
            "title": "Rows Read",
            "type": "integer"
          },
          "unmatched": {
            "description": "Rows with a value the other table does not hold.",
            "title": "Unmatched",
            "type": "integer"
          },
          "unmatched_examples": {
            "description": "Up to five of this table's values that matched nothing, as typed.",
            "items": {
              "type": "string"
            },
            "title": "Unmatched Examples",
            "type": "array"
          },
          "without_key": {
            "description": "Rows with nothing in any column matched on.",
            "title": "Without Key",
            "type": "integer"
          }
        },
        "required": [
          "rows_read",
          "matched",
          "unmatched",
          "without_key",
          "unmatched_examples",
          "error"
        ],
        "title": "ReferenceMatchPreviewSchema",
        "type": "object"
      },
      "ReferenceSettings-Input": {
        "description": "Settings for a reference column: which other table, matched how, bringing back what.\n\nEach row points at ONE row of ``table_id``: the first key pair whose\ncanonical value (``table_types_service.reference_key``) equals some row's\nvalue there wins, and among several such rows the first in that table's\norder. Columns are held by id, so a rename on either side changes nothing.\nEvery field has a column of its own on the reference's table, and the\ncell shows the matched row by the other table's name column; neither is\na setting.",
        "properties": {
          "fields": {
            "description": "The values brought back from the matched row, each one a column.",
            "items": {
              "$ref": "#/components/schemas/ReferenceField"
            },
            "maxItems": 50,
            "title": "Fields",
            "type": "array"
          },
          "keys": {
            "description": "The pairs to match on, tried in order.",
            "items": {
              "$ref": "#/components/schemas/ReferenceKey"
            },
            "maxItems": 3,
            "title": "Keys",
            "type": "array"
          },
          "kind": {
            "const": "reference",
            "default": "reference",
            "title": "Kind",
            "type": "string"
          },
          "managed_by_search": {
            "default": false,
            "description": "Kept by a people search that follows the other table.",
            "title": "Managed By Search",
            "type": "boolean"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table each row points into.",
            "title": "Table Id"
          }
        },
        "title": "ReferenceSettings",
        "type": "object"
      },
      "ReferenceSettings-Output": {
        "description": "Settings for a reference column: which other table, matched how, bringing back what.\n\nEach row points at ONE row of ``table_id``: the first key pair whose\ncanonical value (``table_types_service.reference_key``) equals some row's\nvalue there wins, and among several such rows the first in that table's\norder. Columns are held by id, so a rename on either side changes nothing.\nEvery field has a column of its own on the reference's table, and the\ncell shows the matched row by the other table's name column; neither is\na setting.",
        "properties": {
          "fields": {
            "description": "The values brought back from the matched row, each one a column.",
            "items": {
              "$ref": "#/components/schemas/ReferenceField"
            },
            "maxItems": 50,
            "title": "Fields",
            "type": "array"
          },
          "keys": {
            "description": "The pairs to match on, tried in order.",
            "items": {
              "$ref": "#/components/schemas/ReferenceKey"
            },
            "maxItems": 3,
            "title": "Keys",
            "type": "array"
          },
          "kind": {
            "const": "reference",
            "default": "reference",
            "title": "Kind",
            "type": "string"
          },
          "managed_by_search": {
            "default": false,
            "description": "Kept by a people search that follows the other table.",
            "title": "Managed By Search",
            "type": "boolean"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table each row points into.",
            "title": "Table Id"
          }
        },
        "title": "ReferenceSettings",
        "type": "object"
      },
      "ReferencingRowsSettings": {
        "description": "Settings for a \"rows pointing here\" column: the other side of a reference.\n\n``reference_column_id`` is a reference column of ``table_id`` that points\ninto THIS table; each row here counts the rows there that point at it. The\nrows are listed by that table's name column, which is not a setting.",
        "properties": {
          "kind": {
            "const": "referencing_rows",
            "default": "referencing_rows",
            "title": "Kind",
            "type": "string"
          },
          "reference_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "That table's reference column pointing into this one.",
            "title": "Reference Column Id"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table whose rows point here.",
            "title": "Table Id"
          }
        },
        "title": "ReferencingRowsSettings",
        "type": "object"
      },
      "ReferralClaimReadSchema": {
        "description": "The outcome of a claim.\n\nAlways 200. A code that does not apply (a reload, an existing customer\nclicking a colleague's link) reports ``attributed: false`` rather than an\nerror, because none of those are failures worth alarming a new user about.",
        "properties": {
          "attributed": {
            "description": "Whether the code was recorded against this workspace.",
            "title": "Attributed",
            "type": "boolean"
          },
          "credits_on_upgrade": {
            "description": "Whole credits this workspace will receive when it starts a paid plan; 0 when nothing was attributed. Signing up pays nothing, so this is the promise the welcome message makes.",
            "title": "Credits On Upgrade",
            "type": "integer"
          },
          "referrer_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The workspace that invited them, for the welcome message. Null on a dry run, which records nothing and so names nobody.",
            "title": "Referrer Name"
          }
        },
        "required": [
          "attributed",
          "credits_on_upgrade",
          "referrer_name"
        ],
        "title": "ReferralClaimReadSchema",
        "type": "object"
      },
      "ReferralClaimRequestSchema": {
        "description": "A referral code captured from the URL, offered up by a newly signed-up user.",
        "properties": {
          "code": {
            "description": "The referral code as captured. Trimmed and normalized server-side.",
            "maxLength": 64,
            "minLength": 1,
            "title": "Code",
            "type": "string"
          },
          "source": {
            "anyOf": [
              {
                "maxLength": 32,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The affiliate's own tag for where the link was shared, banked at click time by the link redirect. Absent for a link followed any other way. Narrowed rather than validated server-side: an unrecognized value becomes untagged rather than failing a claim.",
            "title": "Source"
          }
        },
        "required": [
          "code"
        ],
        "title": "ReferralClaimRequestSchema",
        "type": "object"
      },
      "ReferralCountSchema": {
        "description": "How many referrals match the current filter.",
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "ReferralCountSchema",
        "type": "object"
      },
      "ReferralProgramReadSchema": {
        "description": "What the program pays. The public half of the referrals API.\n\nEverything else about a referral is workspace-private; these two numbers\nare the offer itself, and the person who most needs to read them (someone\non the signup page holding a friend's link) has no account yet.",
        "properties": {
          "conversion_reward_credits": {
            "description": "Whole credits paid to BOTH sides when a referred workspace starts its first paid plan. Signing up pays nothing.",
            "title": "Conversion Reward Credits",
            "type": "integer"
          }
        },
        "required": [
          "conversion_reward_credits"
        ],
        "title": "ReferralProgramReadSchema",
        "type": "object"
      },
      "ReferralReadSchema": {
        "description": "One row of the referral list.",
        "properties": {
          "converted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When they started their first paid plan; null while still on free.",
            "title": "Converted At"
          },
          "credits_earned": {
            "description": "Credits this referral has earned the referrer, in decimal credits.",
            "title": "Credits Earned",
            "type": "number"
          },
          "email": {
            "title": "Email",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The referred person's display name, when known.",
            "title": "Name"
          },
          "signed_up_at": {
            "description": "When they joined through the link.",
            "format": "date-time",
            "title": "Signed Up At",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ReferralStatus"
          }
        },
        "required": [
          "id",
          "name",
          "email",
          "signed_up_at",
          "converted_at",
          "status",
          "credits_earned"
        ],
        "title": "ReferralReadSchema",
        "type": "object"
      },
      "ReferralStatsSchema": {
        "description": "The three headline numbers on the referrals page.",
        "properties": {
          "converted_count": {
            "description": "How many of them are on a paid plan.",
            "title": "Converted Count",
            "type": "integer"
          },
          "credits_earned": {
            "description": "Credits this workspace has been paid by the referral program, in decimal credits. Summed from payouts actually granted, so it never disagrees with the balance.",
            "title": "Credits Earned",
            "type": "number"
          },
          "signed_up_count": {
            "description": "How many friends have joined through the link, in total. Cumulative: it includes the ones who have since started paying.",
            "title": "Signed Up Count",
            "type": "integer"
          }
        },
        "required": [
          "signed_up_count",
          "converted_count",
          "credits_earned"
        ],
        "title": "ReferralStatsSchema",
        "type": "object"
      },
      "ReferralStatus": {
        "description": "How far along one referral is: the list filter's vocabulary.\n\nDeliberately NOT Clay's \"lead\" / \"conversion\". This product has a Find\nLeads feature, so a referral labelled a lead reads as a sales prospect.",
        "enum": [
          "signed_up",
          "converted"
        ],
        "title": "ReferralStatus",
        "type": "string"
      },
      "ReferralSummaryReadSchema": {
        "description": "Everything the referrals page needs before it lists anything.",
        "properties": {
          "code": {
            "description": "The workspace's permanent referral code.",
            "title": "Code",
            "type": "string"
          },
          "conversion_reward_credits": {
            "description": "Whole credits paid to BOTH sides when a referred workspace starts its first paid plan. Signing up pays nothing.",
            "title": "Conversion Reward Credits",
            "type": "integer"
          },
          "link": {
            "description": "The full URL to share. Assembled server-side so the client never has to know which domain the program currently points at.",
            "title": "Link",
            "type": "string"
          },
          "stats": {
            "$ref": "#/components/schemas/ReferralStatsSchema"
          }
        },
        "required": [
          "code",
          "link",
          "stats",
          "conversion_reward_credits"
        ],
        "title": "ReferralSummaryReadSchema",
        "type": "object"
      },
      "RegenerateRequestCreateSchema": {
        "description": "Retry on a proposed learning whose rewrite or learning failed, in the background.",
        "properties": {
          "event_id": {
            "description": "The proposed learning's thumbs down.",
            "format": "uuid",
            "title": "Event Id",
            "type": "string"
          },
          "kind": {
            "const": "regenerate",
            "description": "Retry, as `POST /agent-learnings/thumbs-downs/{event_id}/regenerate/` does it.",
            "title": "Kind",
            "type": "string"
          },
          "request_id": {
            "description": "The client's key for this Retry: sent again (a double click, a retry), it answers the same one and spends nothing again.",
            "format": "uuid",
            "title": "Request Id",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "event_id",
          "request_id"
        ],
        "title": "RegenerateRequestCreateSchema",
        "type": "object"
      },
      "RemovedOutcomeReviewSchema": {
        "description": "What a change does to the contacts of one Browser use outcome it removes (BU-16).",
        "properties": {
          "label": {
            "description": "The outcome's name.",
            "title": "Label",
            "type": "string"
          },
          "lines": {
            "description": "The review's sentences for this outcome; the AI Assistant says the same. The step's sentences (waiting, running) come on its first outcome removed only.",
            "items": {
              "type": "string"
            },
            "title": "Lines",
            "type": "array"
          },
          "running": {
            "default": 0,
            "description": "The step's runs under way, claimed under the outcomes as they were: they end on Needs human. The same on every outcome the step loses.",
            "title": "Running",
            "type": "integer"
          },
          "step": {
            "description": "The step's name, as its card names it.",
            "title": "Step",
            "type": "string"
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "took": {
            "description": "Contacts whose run took it; their history keeps it.",
            "title": "Took",
            "type": "integer"
          },
          "waiting": {
            "description": "Live contacts still on the step whose runs are not under way: they choose among the other outcomes. The same on every outcome the step loses.",
            "title": "Waiting",
            "type": "integer"
          }
        },
        "required": [
          "step_id",
          "step",
          "label",
          "took",
          "waiting"
        ],
        "title": "RemovedOutcomeReviewSchema",
        "type": "object"
      },
      "RemovedStepLineSchema": {
        "description": "One sentence about the contacts on a removed step, as Review changes says it.",
        "properties": {
          "line": {
            "title": "Line",
            "type": "string"
          },
          "stops": {
            "description": "True when it says contacts stop, which reads as a warning.",
            "title": "Stops",
            "type": "boolean"
          }
        },
        "required": [
          "line",
          "stops"
        ],
        "title": "RemovedStepLineSchema",
        "type": "object"
      },
      "RemovedStepReviewSchema": {
        "description": "What a change does to the live contacts standing on one step it removes.",
        "properties": {
          "finishing": {
            "description": "Contacts whose way in now leads to an end: they finish.",
            "title": "Finishing",
            "type": "integer"
          },
          "going_on": {
            "description": "Contacts who go on to the step their way in now leads to.",
            "title": "Going On",
            "type": "integer"
          },
          "lines": {
            "description": "The review's sentences for this step, in order: who stops, who goes on and where, who finishes. The AI Assistant's card says the same sentences.",
            "items": {
              "$ref": "#/components/schemas/RemovedStepLineSchema"
            },
            "title": "Lines",
            "type": "array"
          },
          "name": {
            "description": "The step's name, as its card named it.",
            "title": "Name",
            "type": "string"
          },
          "next_step": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where those going on go, when it is one step for all of them.",
            "title": "Next Step"
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "stopped": {
            "description": "Contacts with no way in to follow, who stop.",
            "title": "Stopped",
            "type": "integer"
          }
        },
        "required": [
          "step_id",
          "name",
          "stopped",
          "going_on",
          "finishing"
        ],
        "title": "RemovedStepReviewSchema",
        "type": "object"
      },
      "RenderedMessageReadSchema": {
        "properties": {
          "agent_written": {
            "default": false,
            "description": "The agent wrote this for the contact. A preview is one draft; the real send is written fresh, unless `approved`.",
            "title": "Agent Written",
            "type": "boolean"
          },
          "approved": {
            "default": false,
            "description": "The words were marked Looks good, with the contact's thread on the AI writing tab or as this one email from the Builder, and still stand, so they are what sends. They stop standing, and the agent writes the step fresh, once the agent's writing or the contact's row changes.",
            "title": "Approved",
            "type": "boolean"
          },
          "body": {
            "title": "Body",
            "type": "string"
          },
          "closing": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EmailClosingReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the send adds below these words, the sender's signature and then the opt-out footer, one blank line apart, so the email can be shown whole as the contact will get it. Set by the preview routes on an email step."
          },
          "in_thread": {
            "title": "In Thread",
            "type": "boolean"
          },
          "is_sample": {
            "default": false,
            "title": "Is Sample",
            "type": "boolean"
          },
          "message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's message these words are, on an agent-written step: the sample on screen, or the one marked Looks good. Marking it Looks good (`PUT /sequences/{sequence_id}/steps/{step_id}/rows/{record_id}/feedback/`) takes it back as `message_id`, so a mark lands only on the words that were read.",
            "title": "Message Id"
          },
          "missing_columns": {
            "items": {
              "type": "string"
            },
            "title": "Missing Columns",
            "type": "array"
          },
          "pinned": {
            "default": false,
            "description": "The words are pinned for this contact by a person (their own edit) or by the approval queue, and send exactly as they are. A thread marked Looks good is `approved` instead.",
            "title": "Pinned",
            "type": "boolean"
          },
          "preview_units": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "With `written` false: how much of today's preview allowance writing it would use, one for each message the agent writes in the call (the contact's whole sequence for a contact not written to yet). Writing is refused when `GET /outbound-agents/preview-allowance/` has fewer `remaining`. Null otherwise, or when it cannot be worked out.",
            "title": "Preview Units"
          },
          "sample_created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sample Created At"
          },
          "sample_version": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sample Version"
          },
          "sent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SentStepEmailReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The email this step already got out to this contact, as it went, when one did: what they received, whoever wrote it, rather than the words above. Set by the preview and samples routes; null when the step has not reached them."
          },
          "spam_findings": {
            "description": "The spam check and the placeholder scan, run on the agent's words for this contact. Always empty for a written step, whose text the composer's own check covers. Advice, never a refusal.",
            "items": {
              "$ref": "#/components/schemas/SpamFindingReadSchema"
            },
            "title": "Spam Findings",
            "type": "array"
          },
          "subject": {
            "title": "Subject",
            "type": "string"
          },
          "waiting_for_approval": {
            "default": false,
            "description": "This contact's message at this step waits for a person's approval on its Tasks card, where its words are changed, approved or rejected. Set by the preview and samples routes; false once the card is decided, or when the step never asked.",
            "title": "Waiting For Approval",
            "type": "boolean"
          },
          "written": {
            "default": true,
            "description": "False only when nothing is written for this contact at this step yet, which the step's preview shows rather than writes: subject and body are empty. `POST /sequences/{sequence_id}/steps/{step_id}/rows/{record_id}/samples/` has the agent write it.",
            "title": "Written",
            "type": "boolean"
          }
        },
        "required": [
          "subject",
          "body",
          "missing_columns",
          "in_thread"
        ],
        "title": "RenderedMessageReadSchema",
        "type": "object"
      },
      "RepDataSettings": {
        "description": "Settings for the rep-data action: which part of the identity to return.",
        "properties": {
          "field": {
            "default": "email_address",
            "enum": [
              "email_address",
              "display_name",
              "first_name",
              "last_name",
              "signature",
              "all"
            ],
            "title": "Field",
            "type": "string"
          },
          "kind": {
            "const": "rep_data",
            "default": "rep_data",
            "title": "Kind",
            "type": "string"
          }
        },
        "title": "RepDataSettings",
        "type": "object"
      },
      "RepliesWaitNoticeReadSchema": {
        "description": "Whether the Inbox shows this person the one-time notice that replies now wait (J4).",
        "properties": {
          "shown": {
            "description": "True for an admin of a workspace whose replies went out on their own before every reply waited for a person, until an admin closes the notice; false for everyone else.",
            "title": "Shown",
            "type": "boolean"
          }
        },
        "required": [
          "shown"
        ],
        "title": "RepliesWaitNoticeReadSchema",
        "type": "object"
      },
      "RepliesWaitNoticeUpdateSchema": {
        "description": "The change an admin makes to the notice that replies now wait: closing it (J4).",
        "properties": {
          "dismissed": {
            "const": true,
            "description": "Send true to close the notice for every admin of the workspace. Closing is one way: nothing shows the notice again.",
            "title": "Dismissed",
            "type": "boolean"
          }
        },
        "required": [
          "dismissed"
        ],
        "title": "RepliesWaitNoticeUpdateSchema",
        "type": "object"
      },
      "ReplyBlockedReason": {
        "description": "Why a sequence's agent wrote no draft for a reply its write gate let in (G9, 2026-10-20).\n\nStored on the reply's assessment by the claim that held it back, or the settle of a\nwrite that came to nothing; cleared once a draft exists or the next claim writes.\n``CREDITS``: the workspace could not pay for the write. ``SPENDING_LIMIT``: the\nsequence reached its spending limit. ``REJECTED_BEFORE``: a person discarded a reply\nto that message, so nothing unattended writes another. ``NO_ENROLMENT``: the contact\nis no longer in the sequence (or their row is gone), so there is nothing to write\nfrom. ``THROTTLED``: the AI was too busy, or writing was paused; the chain waits it\nout, and the reason stays once its tries are spent. ``EMPTY_DRAFT``: the write came\nto nothing usable. ``DORMANT``: the reply came long after the contact's sequence\nended (D10), so it is left to a person.",
        "enum": [
          "credits",
          "spending_limit",
          "rejected_before",
          "no_enrolment",
          "throttled",
          "empty_draft",
          "dormant"
        ],
        "title": "ReplyBlockedReason",
        "type": "string"
      },
      "ReplyDraftSubjectSchema": {
        "description": "A reply draft on the Inbox ribbon.",
        "properties": {
          "draft_id": {
            "format": "uuid",
            "title": "Draft Id",
            "type": "string"
          },
          "kind": {
            "const": "reply_draft",
            "title": "Kind",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "draft_id"
        ],
        "title": "ReplyDraftSubjectSchema",
        "type": "object"
      },
      "ReplyDraftTargetSchema": {
        "description": "A reply draft on the Inbox ribbon, its words edited in the composer.",
        "properties": {
          "draft_id": {
            "format": "uuid",
            "title": "Draft Id",
            "type": "string"
          },
          "target_kind": {
            "const": "reply_draft",
            "title": "Target Kind",
            "type": "string"
          }
        },
        "required": [
          "target_kind",
          "draft_id"
        ],
        "title": "ReplyDraftTargetSchema",
        "type": "object"
      },
      "ReplyLabel": {
        "description": "One of the inbox's built-in labels, as a sequence's reply settings name it.\n\nThe tick boxes under Write replies: the labels whose replies the agent\nwrites an answer to. The inbox ranks above this package, so its\n``SeededLabel`` cannot be named here; the inbox maps its label to this\none (``inbox.types.REPLY_LABEL_OF``), never the other way round. The\nvalue is a stored key, never shown: ``REPLY_LABEL_NAMES`` holds the\nwords, which are the inbox labels' own names.",
        "enum": [
          "positive",
          "negative",
          "meeting_booked",
          "meeting_completed",
          "closed",
          "wrong_contact",
          "out_of_office",
          "auto_reply"
        ],
        "title": "ReplyLabel",
        "type": "string"
      },
      "ReplyLabelCountReadSchema": {
        "description": "How many of the sequence's replies carry one label, and who gave it.",
        "properties": {
          "by_agent": {
            "description": "Replies the agent labelled so.",
            "title": "By Agent",
            "type": "integer"
          },
          "by_person": {
            "description": "Replies a person labelled so, or relabelled to it.",
            "title": "By Person",
            "type": "integer"
          },
          "label": {
            "description": "The label's name, as the Inbox shows it.",
            "title": "Label",
            "type": "string"
          },
          "replies": {
            "title": "Replies",
            "type": "integer"
          }
        },
        "required": [
          "label",
          "replies",
          "by_agent",
          "by_person"
        ],
        "title": "ReplyLabelCountReadSchema",
        "type": "object"
      },
      "ReplyQuestionSchema": {
        "description": "One fact the agent needs from the sender's team before it answers a reply.",
        "properties": {
          "id": {
            "description": "The question's id within its card; an answer names it.",
            "title": "Id",
            "type": "string"
          },
          "text": {
            "description": "The question, to the sender's team, written to stand without the conversation and naming nothing of the contact.",
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "id",
          "text"
        ],
        "title": "ReplyQuestionSchema",
        "type": "object"
      },
      "ReplyReadiness": {
        "description": "Whether the agent could answer a reply with what it has (E2, 2026-10-19).\n\nREADY: everything an answer needs is in hand, or no answer is needed.\nNEEDS_FACTS: an answer needs a fact about the sender's offer nobody wrote\ndown, asked for in the verdict's questions. NEEDS_PERSON: an answer needs a\njudgement only a person of the sender's can make, said in the reason.",
        "enum": [
          "ready",
          "needs_facts",
          "needs_person"
        ],
        "title": "ReplyReadiness",
        "type": "string"
      },
      "ReplyState": {
        "description": "Whether the contact's latest reply has had an answer from us.\n\nA filter over the working inbox, where every conversation is one the\ncontact answered. REPLIED: an answer of ours went out after their latest\nreply, written by a person or by the agent. A LinkedIn reply queued for the\nbrowser counts once nothing waits on a person's approval for it (a person\nsent it, or its task was approved); one still waiting on Tasks, a failed\none and a forward to somebody else do not. NOT_REPLIED: their latest reply\nis still the last word. Only a genuine reply asks for an answer, so an\nauto-reply or a bounce arriving after our answer leaves a conversation\nREPLIED, and a thread whose only inbound mail is automatic is no\nconversation at all: the inbox does not list it, so neither state does.",
        "enum": [
          "replied",
          "not_replied"
        ],
        "title": "ReplyState",
        "type": "string"
      },
      "ResearchFactCategory": {
        "description": "The kinds of fact a research brief may hold; anything else the opener found is dropped.",
        "enum": [
          "role",
          "company",
          "product",
          "news",
          "hiring",
          "funding",
          "technology",
          "content",
          "other"
        ],
        "title": "ResearchFactCategory",
        "type": "string"
      },
      "RestoreState": {
        "description": "Where putting an undone event's original output back stands.",
        "enum": [
          "none",
          "waiting",
          "restored",
          "left"
        ],
        "title": "RestoreState",
        "type": "string"
      },
      "ResumeContactsSchema": {
        "description": "The contacts a bulk resume reaches, and whether they are the out-of-office ones.",
        "properties": {
          "all": {
            "default": false,
            "description": "Act on every contact the filters match, or every contact when there are none. Required when ids is absent.",
            "title": "All",
            "type": "boolean"
          },
          "created_from": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only contacts added on or after this instant. The grid's date range, which an action on everything matching has to honour or it reaches past what the person was looking at.",
            "title": "Created From"
          },
          "created_to": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created To"
          },
          "exclude": {
            "default": false,
            "description": "Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.",
            "title": "Exclude",
            "type": "boolean"
          },
          "excluded_ids": {
            "description": "With all, contacts to leave out: the rows unticked after ticking the header.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 1000,
            "title": "Excluded Ids",
            "type": "array"
          },
          "group": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContactGroup"
              },
              {
                "type": "null"
              }
            ],
            "description": "The Audience tab's tab the grid was showing. An action on everything matching reaches only the contacts under it, or Select all under one tab would act on everyone."
          },
          "ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contacts to act on, by enrolment id.",
            "title": "Ids"
          },
          "order_by": {
            "$ref": "#/components/schemas/ContactOrderBy",
            "default": "created_at",
            "description": "The order the grid was listing in. Under a 'group', the action judges the same contacts the tab's list judged in that order."
          },
          "order_direction": {
            "default": "desc",
            "description": "The direction of order_by.",
            "enum": [
              "asc",
              "desc"
            ],
            "title": "Order Direction",
            "type": "string"
          },
          "out_of_office": {
            "default": false,
            "description": "Reach only the contacts whose thread reads out of office: one snoozed to a stated return date is due now, and one a misclassified auto-responder stopped as a reply picks up where they stopped. Either finishes a wait they were in first.",
            "title": "Out Of Office",
            "type": "boolean"
          },
          "outcomes": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/SequenceEdgeBranch"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only contacts whose latest settled Browser use run took one of these outcomes: the grid's Outcome filter.",
            "title": "Outcomes"
          },
          "search": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Search"
          },
          "statuses": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/EnrolmentStatus"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Statuses"
          },
          "stop_reasons": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/StopReason"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Stop Reasons"
          }
        },
        "title": "ResumeContactsSchema",
        "type": "object"
      },
      "RevertReadSchema": {
        "description": "What Undo did.",
        "properties": {
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the output was left, as the screen shows it.",
            "title": "Detail"
          },
          "event_id": {
            "format": "uuid",
            "title": "Event Id",
            "type": "string"
          },
          "learning": {
            "$ref": "#/components/schemas/LearningOutcome",
            "description": "`removed` (the learning it added is gone), `restored` (the learning it rewrote says what it said before) or `left` (someone changed the learning since, so it stays)."
          },
          "output": {
            "$ref": "#/components/schemas/RestoreState",
            "description": "`none` when nothing was redone, `restored` when the original output is back, `waiting` while the redo finishes (it is put back then), `left` when it can't be."
          }
        },
        "required": [
          "event_id",
          "learning",
          "output",
          "detail"
        ],
        "title": "RevertReadSchema",
        "type": "object"
      },
      "RowsNotAddedSchema": {
        "description": "People a search found that did not become rows, and why.",
        "properties": {
          "count": {
            "description": "How many people were found and not added.",
            "title": "Count",
            "type": "integer"
          },
          "reason": {
            "$ref": "#/components/schemas/NotAddedReason",
            "description": "`found_twice`: the people search holds the same person under two records, and a table takes each person once. `already_in_table`: the person was already a row of the table, which was kept."
          }
        },
        "required": [
          "count",
          "reason"
        ],
        "title": "RowsNotAddedSchema",
        "type": "object"
      },
      "RunTableSourceRequestSchema": {
        "description": "What kind of refresh to run.\n\nTwo independent asks, not one dial. Re-fetching every record is safe and\nroutine; deleting local rows whose records are gone is destructive and\ndeliberate. Both default to off, so a plain refresh stays the cheap\nincremental one.",
        "properties": {
          "delete_missing_rows": {
            "default": false,
            "description": "Delete imported rows whose records the source no longer returns. Implies a full re-list, and is refused while the source has a row limit: a capped import cannot tell a deleted record from one it never fetched.",
            "title": "Delete Missing Rows",
            "type": "boolean"
          },
          "full_relist": {
            "default": false,
            "description": "Re-fetch every record instead of only those changed since the last run. Updates rows; never deletes any.",
            "title": "Full Relist",
            "type": "boolean"
          }
        },
        "title": "RunTableSourceRequestSchema",
        "type": "object"
      },
      "SampleRowsOrigin": {
        "description": "Where an agent's remembered example rows were found.",
        "enum": [
          "table",
          "generated"
        ],
        "title": "SampleRowsOrigin",
        "type": "string"
      },
      "SampleRowsResponseSchema": {
        "description": "Example rows to fill the grid with, and where they came from.",
        "properties": {
          "inputs_changed": {
            "default": false,
            "description": "A remembered set was discarded because the agent's inputs no longer matched it, so these are fresh.",
            "title": "Inputs Changed",
            "type": "boolean"
          },
          "origin": {
            "$ref": "#/components/schemas/SampleRowsOrigin",
            "description": "How the values were found: read out of one of the org's own tables, or written by the model."
          },
          "remembered": {
            "default": false,
            "description": "These were replayed from the agent rather than found afresh.",
            "title": "Remembered",
            "type": "boolean"
          },
          "rows": {
            "description": "One set of input values per example, in offer order.",
            "items": {
              "additionalProperties": {
                "maxLength": 8000,
                "type": "string"
              },
              "propertyNames": {
                "maxLength": 100,
                "minLength": 1
              },
              "type": "object"
            },
            "title": "Rows",
            "type": "array"
          },
          "table_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table the values came from; null when they were generated.",
            "title": "Table Name"
          }
        },
        "required": [
          "rows",
          "origin"
        ],
        "title": "SampleRowsResponseSchema",
        "type": "object"
      },
      "SaveLeadSearchRequestSchema": {
        "description": "A search worth keeping: the filters plus a name to find them by.",
        "properties": {
          "backlinks": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BacklinksQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "hiring_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HiringCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "local_businesses": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LocalBusinessQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "lookalikes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LookalikeQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "post_authors": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PostAuthorsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "row_limit": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rows to add each time the search runs. Clamped further by the organisation's plan cap; omit for the maximum.",
            "title": "Row Limit"
          },
          "search_results": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SearchResultsQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_companies": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalCompaniesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "signal_people": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SignalPeopleQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "startup_launches": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StartupLaunchesQuerySchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "record_type",
          "name"
        ],
        "title": "SaveLeadSearchRequestSchema",
        "type": "object"
      },
      "SavedAgentCreateSchema": {
        "description": "A new saved agent's full configuration.",
        "properties": {
          "allow_fetch": {
            "default": true,
            "title": "Allow Fetch",
            "type": "boolean"
          },
          "allow_find_email": {
            "default": false,
            "description": "Let runs buy a work email from the product's data suppliers, paid from the run's research budget. Refused when the supplier is not available to this organisation.",
            "title": "Allow Find Email",
            "type": "boolean"
          },
          "allow_linkedin_profile": {
            "default": false,
            "description": "Let runs read a LinkedIn profile through the product's data suppliers, paid from the run's research budget. Refused when the supplier is not available to this organisation.",
            "title": "Allow Linkedin Profile",
            "type": "boolean"
          },
          "allow_search": {
            "default": true,
            "title": "Allow Search",
            "type": "boolean"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "effort": {
            "$ref": "#/components/schemas/AgentEffortLevel",
            "default": "standard"
          },
          "icon": {
            "anyOf": [
              {
                "maxLength": 16,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Icon"
          },
          "inputs": {
            "description": "The declared inputs, in the author's order.",
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "maxItems": 20,
            "title": "Inputs",
            "type": "array"
          },
          "is_template": {
            "default": false,
            "description": "Save as a reusable starting point instead of a working agent. Templates are offered in the template gallery and never run.",
            "title": "Is Template",
            "type": "boolean"
          },
          "model_key": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Key"
          },
          "name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "output_schema": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "fields": "#/components/schemas/EnrichmentOutputFields-Input",
                    "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
                  },
                  "propertyName": "mode"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/EnrichmentOutputFields-Input"
                  },
                  {
                    "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Output Schema"
          },
          "prompt": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Input"
          },
          "sample_rows": {
            "description": "Example input rows to remember for the Train screen: the `test_cases` the build flow just generated. Keyed by input name. Suggestion memory, not configuration: storing them never bumps the agent's version.",
            "items": {
              "additionalProperties": {
                "type": "string"
              },
              "type": "object"
            },
            "maxItems": 25,
            "title": "Sample Rows",
            "type": "array"
          },
          "template_key": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The `key` of the built-in agent template this agent copies. The copy keeps the template's rules as its learnings, since its prompt holds only the goal.",
            "title": "Template Key"
          },
          "use_business_context": {
            "default": false,
            "title": "Use Business Context",
            "type": "boolean"
          },
          "use_row_context": {
            "default": false,
            "title": "Use Row Context",
            "type": "boolean"
          }
        },
        "required": [
          "name"
        ],
        "title": "SavedAgentCreateSchema",
        "type": "object"
      },
      "SavedAgentGenerateRequestSchema": {
        "description": "A natural-language task to expand into a full agent draft.",
        "properties": {
          "reference_material": {
            "anyOf": [
              {
                "maxLength": 24000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Text from files the user attached to the builder, concatenated. Folded into prompt generation so the draft reflects their own rubric or guide.",
            "title": "Reference Material"
          },
          "task_description": {
            "maxLength": 4000,
            "minLength": 1,
            "title": "Task Description",
            "type": "string"
          }
        },
        "required": [
          "task_description"
        ],
        "title": "SavedAgentGenerateRequestSchema",
        "type": "object"
      },
      "SavedAgentGeneratedDraftSchema": {
        "description": "The AI-built agent draft the editor seeds itself from.",
        "properties": {
          "icon": {
            "title": "Icon",
            "type": "string"
          },
          "inputs": {
            "description": "The inputs the generated prompt declares. The editor seeds its Inputs section from this, never by parsing the prompt.",
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "title": "Inputs",
            "type": "array"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "output_schema": {
            "discriminator": {
              "mapping": {
                "fields": "#/components/schemas/EnrichmentOutputFields-Output",
                "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
              },
              "propertyName": "mode"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnrichmentOutputFields-Output"
              },
              {
                "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
              }
            ],
            "title": "Output Schema"
          },
          "prompt": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Output"
          },
          "test_cases": {
            "items": {
              "additionalProperties": {
                "type": "string"
              },
              "type": "object"
            },
            "title": "Test Cases",
            "type": "array"
          }
        },
        "required": [
          "name",
          "icon",
          "prompt",
          "inputs",
          "output_schema",
          "test_cases"
        ],
        "title": "SavedAgentGeneratedDraftSchema",
        "type": "object"
      },
      "SavedAgentGenerationStopResponseSchema": {
        "description": "A Stop was asked for. Whether it lands is the stream's to say.\n\nThe flag is cooperative and best effort: the build reads it before its\nnext model call, and a build that has already finished is not affected.\nThe stream reports the outcome as an `error` frame with reason `stopped`.",
        "properties": {
          "generation_id": {
            "format": "uuid",
            "title": "Generation Id",
            "type": "string"
          }
        },
        "required": [
          "generation_id"
        ],
        "title": "SavedAgentGenerationStopResponseSchema",
        "type": "object"
      },
      "SavedAgentInputGenerateRequestSchema": {
        "description": "A prompt to work out the per-row inputs of.",
        "properties": {
          "inputs": {
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "maxItems": 20,
            "title": "Inputs",
            "type": "array"
          },
          "prompt": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Input"
          }
        },
        "required": [
          "prompt"
        ],
        "title": "SavedAgentInputGenerateRequestSchema",
        "type": "object"
      },
      "SavedAgentInputGenerateResponseSchema": {
        "description": "The declared inputs, and the prompt rewritten to reference them.",
        "properties": {
          "inputs": {
            "description": "Every declared input after the pass: the ones already held, each keeping its id, plus any the prompt turned out to need.",
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "title": "Inputs",
            "type": "array"
          },
          "prompt": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Output"
          },
          "summary": {
            "title": "Summary",
            "type": "string"
          }
        },
        "required": [
          "prompt",
          "inputs",
          "summary"
        ],
        "title": "SavedAgentInputGenerateResponseSchema",
        "type": "object"
      },
      "SavedAgentOutputGenerateRequestSchema": {
        "description": "A prompt to derive an output schema from.",
        "properties": {
          "inputs": {
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "maxItems": 20,
            "title": "Inputs",
            "type": "array"
          },
          "prompt": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Input"
          }
        },
        "required": [
          "prompt"
        ],
        "title": "SavedAgentOutputGenerateRequestSchema",
        "type": "object"
      },
      "SavedAgentOutputGenerateResponseSchema": {
        "description": "The generated output schema, ready to drop into the editor.",
        "properties": {
          "output_schema": {
            "discriminator": {
              "mapping": {
                "fields": "#/components/schemas/EnrichmentOutputFields-Output",
                "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
              },
              "propertyName": "mode"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnrichmentOutputFields-Output"
              },
              {
                "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
              }
            ],
            "title": "Output Schema"
          }
        },
        "required": [
          "output_schema"
        ],
        "title": "SavedAgentOutputGenerateResponseSchema",
        "type": "object"
      },
      "SavedAgentPromptEditRequestSchema": {
        "description": "A natural-language change to make to an existing agent prompt.",
        "properties": {
          "current_prompt": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Input"
          },
          "inputs": {
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "maxItems": 20,
            "title": "Inputs",
            "type": "array"
          },
          "instruction": {
            "maxLength": 4000,
            "minLength": 1,
            "title": "Instruction",
            "type": "string"
          }
        },
        "required": [
          "current_prompt",
          "instruction"
        ],
        "title": "SavedAgentPromptEditRequestSchema",
        "type": "object"
      },
      "SavedAgentPromptEditResponseSchema": {
        "description": "The revised prompt and a one-line account of what changed.",
        "properties": {
          "inputs": {
            "description": "The declared inputs after the edit; a revision may mint one.",
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "title": "Inputs",
            "type": "array"
          },
          "prompt": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Output"
          },
          "summary": {
            "title": "Summary",
            "type": "string"
          }
        },
        "required": [
          "prompt",
          "inputs",
          "summary"
        ],
        "title": "SavedAgentPromptEditResponseSchema",
        "type": "object"
      },
      "SavedAgentPromptEditStopResponseSchema": {
        "description": "A Stop was asked for. Whether it lands is the stream's to say.\n\nCooperative and best effort: the revision reads the flag once a second\nwhile the model writes and again before the prompt is handed back, and a\nrevision that has already landed is not affected. The stream reports the\noutcome as an `error` frame with reason `stopped`.",
        "properties": {
          "edit_id": {
            "format": "uuid",
            "title": "Edit Id",
            "type": "string"
          }
        },
        "required": [
          "edit_id"
        ],
        "title": "SavedAgentPromptEditStopResponseSchema",
        "type": "object"
      },
      "SavedAgentReadSchema": {
        "description": "One org-level saved agent as the editor, picker and library render it.",
        "properties": {
          "allow_fetch": {
            "title": "Allow Fetch",
            "type": "boolean"
          },
          "allow_find_email": {
            "default": false,
            "description": "Whether a run may buy a work email from the product's data suppliers while it researches, paid from the run's research budget.",
            "title": "Allow Find Email",
            "type": "boolean"
          },
          "allow_linkedin_profile": {
            "default": false,
            "description": "Whether a run may read a LinkedIn profile through the product's data suppliers while it researches, paid from the run's research budget.",
            "title": "Allow Linkedin Profile",
            "type": "boolean"
          },
          "allow_search": {
            "title": "Allow Search",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "current_version": {
            "title": "Current Version",
            "type": "integer"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "effort": {
            "$ref": "#/components/schemas/AgentEffortLevel"
          },
          "granted_verbs": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The workspace actions this agent may apply without asking, as verb keys (see GET /assistant/verbs/). Null means the workspace defaults apply. The agent's table runs take an allowed action themselves, without a card.",
            "title": "Granted Verbs"
          },
          "has_enabled_mcp_servers": {
            "default": false,
            "description": "Whether at least one enabled MCP server is attached. A run then researches through it even with web research off, so what a row usually costs is quoted as research's share of its most, not a plain call's.",
            "title": "Has Enabled Mcp Servers",
            "type": "boolean"
          },
          "icon": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Icon"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "inputs": {
            "items": {
              "$ref": "#/components/schemas/AgentInputSchema"
            },
            "title": "Inputs",
            "type": "array"
          },
          "is_favorite": {
            "description": "Whether the person asking starred this agent. A star is one person's own, so a teammate's list differs; always false for an API key.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "is_template": {
            "default": false,
            "title": "Is Template",
            "type": "boolean"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the person asking last opened this agent; null when they never have, and always for an API key.",
            "title": "Last Viewed At"
          },
          "model_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Key"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "output_schema": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "fields": "#/components/schemas/EnrichmentOutputFields-Output",
                    "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
                  },
                  "propertyName": "mode"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/EnrichmentOutputFields-Output"
                  },
                  {
                    "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Output Schema"
          },
          "owner_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Owner Display Name"
          },
          "owner_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Owner User Id"
          },
          "prompt": {
            "$ref": "#/components/schemas/AgentPromptTemplate-Output"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "use_business_context": {
            "title": "Use Business Context",
            "type": "boolean"
          },
          "use_row_context": {
            "title": "Use Row Context",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "effort",
          "created_at",
          "updated_at",
          "prompt",
          "inputs",
          "output_schema",
          "model_key",
          "allow_search",
          "allow_fetch",
          "use_business_context",
          "use_row_context",
          "owner_user_id",
          "is_favorite",
          "icon",
          "current_version"
        ],
        "title": "SavedAgentReadSchema",
        "type": "object"
      },
      "SavedAgentSampleRowsSchema": {
        "description": "The example rows an agent's Train screen remembers, and where they came from.",
        "properties": {
          "origin": {
            "$ref": "#/components/schemas/SampleRowsOrigin",
            "description": "Read out of one of the org's own tables, or written by the model."
          },
          "rows": {
            "description": "One set of input values per example, keyed by input name, in offer order. An empty list forgets the remembered set.",
            "items": {
              "additionalProperties": {
                "maxLength": 8000,
                "type": "string"
              },
              "propertyNames": {
                "maxLength": 100,
                "minLength": 1
              },
              "type": "object"
            },
            "maxItems": 25,
            "title": "Rows",
            "type": "array"
          },
          "table_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table the values came from, for the caption; null when generated.",
            "title": "Table Name"
          }
        },
        "required": [
          "rows",
          "origin"
        ],
        "title": "SavedAgentSampleRowsSchema",
        "type": "object"
      },
      "SavedAgentUpdateSchema": {
        "description": "A partial saved-agent update; absent fields keep their value.",
        "properties": {
          "allow_fetch": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Allow Fetch"
          },
          "allow_find_email": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Switch the work-email tool on or off; switching it on is refused when the supplier is not available to this organisation.",
            "title": "Allow Find Email"
          },
          "allow_linkedin_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Switch the LinkedIn-profile tool on or off; switching it on is refused when the supplier is not available to this organisation.",
            "title": "Allow Linkedin Profile"
          },
          "allow_search": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Allow Search"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "effort": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentEffortLevel"
              },
              {
                "type": "null"
              }
            ]
          },
          "granted_verbs": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "maxItems": 8,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The workspace actions the agent may apply without asking, as verb keys (see GET /assistant/verbs/). Send null to fall back to the workspace defaults; an empty list switches every action off. A send is refused. The agent's table runs take an allowed action themselves, without a card.",
            "title": "Granted Verbs"
          },
          "icon": {
            "anyOf": [
              {
                "maxLength": 16,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Icon"
          },
          "inputs": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/AgentInputSchema"
                },
                "maxItems": 20,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Inputs"
          },
          "model_key": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Key"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "output_schema": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "fields": "#/components/schemas/EnrichmentOutputFields-Input",
                    "json_schema": "#/components/schemas/EnrichmentOutputRawSchema"
                  },
                  "propertyName": "mode"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/EnrichmentOutputFields-Input"
                  },
                  {
                    "$ref": "#/components/schemas/EnrichmentOutputRawSchema"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Output Schema"
          },
          "prompt": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentPromptTemplate-Input"
              },
              {
                "type": "null"
              }
            ]
          },
          "use_business_context": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Use Business Context"
          },
          "use_row_context": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Use Row Context"
          }
        },
        "title": "SavedAgentUpdateSchema",
        "type": "object"
      },
      "SavedAgentUsageReadSchema": {
        "description": "One table column a saved agent is deployed on.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "column_name": {
            "title": "Column Name",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "table_name": {
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "table_name",
          "column_id",
          "column_name"
        ],
        "title": "SavedAgentUsageReadSchema",
        "type": "object"
      },
      "SavedAgentUserPrefsReadSchema": {
        "description": "The asking person's own star and last open of one saved agent.",
        "properties": {
          "is_favorite": {
            "description": "Whether this person starred the agent.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this person last opened the agent; null means never.",
            "title": "Last Viewed At"
          }
        },
        "required": [
          "is_favorite",
          "last_viewed_at"
        ],
        "title": "SavedAgentUserPrefsReadSchema",
        "type": "object"
      },
      "SavedAgentVersionReadSchema": {
        "description": "One entry of an agent's version history.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_current": {
            "title": "Is Current",
            "type": "boolean"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the agent was called at this version.",
            "title": "Name"
          },
          "prompt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The prompt as it stood at this version, FLATTENED to wire text for the read-only history and diff views. Deliberately a string, since history is read and compared, never edited.",
            "title": "Prompt"
          },
          "source": {
            "$ref": "#/components/schemas/SavedAgentVersionSource",
            "description": "Why this version was written: `manual` (a person saved it), `revert` (an earlier version put back), `create`, `copy`, `feedback` (an older release's accepted revision), `simplified` (the release shortened a long prompt into a goal and the agent's learnings), or, for a sequence's writer, `research`, `replies_off`, `tailored` or `standard`."
          },
          "version": {
            "title": "Version",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "version",
          "created_at",
          "is_current",
          "source"
        ],
        "title": "SavedAgentVersionReadSchema",
        "type": "object"
      },
      "SavedAgentVersionSource": {
        "description": "Why a saved agent's version was written; the agent's history names it beside it.",
        "enum": [
          "manual",
          "create",
          "revert",
          "copy",
          "feedback",
          "simplified",
          "research",
          "replies_off",
          "tailored",
          "standard"
        ],
        "title": "SavedAgentVersionSource",
        "type": "string"
      },
      "SavedLeadSearchResponseSchema": {
        "description": "A saved search, in the request's own shape for lossless rehydration.",
        "properties": {
          "ai_made": {
            "default": false,
            "description": "Whether the AI Assistant saved this search through a granted action. Saved by is still the person who approved it.",
            "title": "Ai Made",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_user_id": {
            "title": "Created By User Id",
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_used_at": {
            "format": "date-time",
            "title": "Last Used At",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "query": {
            "additionalProperties": true,
            "title": "Query",
            "type": "object"
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "row_limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Row Limit"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "record_type",
          "query",
          "row_limit",
          "created_by_user_id",
          "last_used_at",
          "created_at"
        ],
        "title": "SavedLeadSearchResponseSchema",
        "type": "object"
      },
      "SavedProposalReadSchema": {
        "description": "What saving a proposed learning did.",
        "properties": {
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Said beside it when the learning it replaced was edited meanwhile.",
            "title": "Detail"
          },
          "event_id": {
            "format": "uuid",
            "title": "Event Id",
            "type": "string"
          },
          "learning": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentLearningReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning as saved; null when it was deleted since."
          },
          "proposal": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposalReadSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "saved": {
            "description": "Whether this call saved it; false for a second press, which saved nothing.",
            "title": "Saved",
            "type": "boolean"
          }
        },
        "required": [
          "event_id",
          "learning",
          "saved",
          "detail",
          "proposal"
        ],
        "title": "SavedProposalReadSchema",
        "type": "object"
      },
      "SavedViewCreateSchema": {
        "properties": {
          "filters": {
            "additionalProperties": true,
            "maxProperties": 50,
            "title": "Filters",
            "type": "object"
          },
          "name": {
            "maxLength": 64,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "name",
          "filters"
        ],
        "title": "SavedViewCreateSchema",
        "type": "object"
      },
      "SavedViewReadSchema": {
        "description": "A named set of inbox filters.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "created_by_email": {
            "title": "Created By Email",
            "type": "string"
          },
          "filters": {
            "additionalProperties": true,
            "title": "Filters",
            "type": "object"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "filters",
          "created_by_email",
          "created_at",
          "updated_at"
        ],
        "title": "SavedViewReadSchema",
        "type": "object"
      },
      "SavedViewUpdateSchema": {
        "description": "R7 partial update: rename, repoint at new filters, or both.\n\nBoth fields optional and independent, so \"rename this\" and \"make this match\nwhat I am looking at now\" are the same endpoint without either overwriting\nthe other with a stale value.",
        "properties": {
          "filters": {
            "anyOf": [
              {
                "additionalProperties": true,
                "maxProperties": 50,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filters"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          }
        },
        "title": "SavedViewUpdateSchema",
        "type": "object"
      },
      "SearchResultsQuerySchema": {
        "description": "Google searches to run, each landing the results Google shows for it.\n\nWrite each search the way you would type it into Google: operators\n(site:, intitle:, quoted phrases) work and cost nothing extra. One row is\none result of one search, with the search that found it and its rank.",
        "properties": {
          "country": {
            "default": "US",
            "description": "The country the searches run from, as a two-letter ISO code (US, GB, DE). Google ranks results for searchers there. US by default.",
            "maxLength": 2,
            "minLength": 2,
            "title": "Country",
            "type": "string"
          },
          "results_per_search": {
            "default": 50,
            "description": "The most results each search adds. A search stops there or where Google runs out of results, whichever comes first. 50 by default.",
            "maximum": 300.0,
            "minimum": 10.0,
            "title": "Results Per Search",
            "type": "integer"
          },
          "searches": {
            "description": "The searches to run, one per entry, exactly as you would type them into Google. Blank entries and repeats are dropped. At most 100 searches.",
            "items": {
              "maxLength": 500,
              "type": "string"
            },
            "maxItems": 100,
            "title": "Searches",
            "type": "array"
          }
        },
        "title": "SearchResultsQuerySchema",
        "type": "object"
      },
      "SegmentKind": {
        "description": "One piece of a subject or body template.",
        "enum": [
          "text",
          "column",
          "builtin",
          "spintax"
        ],
        "title": "SegmentKind",
        "type": "string"
      },
      "SelectChoice": {
        "description": "One option of a select or multi-select column.",
        "properties": {
          "color": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A column colour token; None renders the neutral chip.",
            "title": "Color"
          },
          "value": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value"
        ],
        "title": "SelectChoice",
        "type": "object"
      },
      "SelectOptions": {
        "description": "Options for a single-select column.",
        "properties": {
          "choices": {
            "items": {
              "$ref": "#/components/schemas/SelectChoice"
            },
            "title": "Choices",
            "type": "array"
          },
          "type": {
            "const": "select",
            "default": "select",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SelectOptions",
        "type": "object"
      },
      "SellsTo": {
        "description": "Who a company's buyer is: the catalog's ``sells_to`` choices, one for one.",
        "enum": [
          "businesses",
          "consumers",
          "both"
        ],
        "title": "SellsTo",
        "type": "string"
      },
      "SendMessageOutcome": {
        "additionalProperties": false,
        "description": "What sending a message produced: the common fields, the profile facts and the thread.\n\n``conversation_urn`` is read off the opened composer when LinkedIn exposes\nit, which is the first moment a brand-new thread has an id at all. A reply\ninto an existing thread happens on the messaging page, where there is no\nprofile to read, so the profile facts stay ``None`` there and\n``member_urn`` is the one the step was given; settlement falls back to the\nparams' urn for a reply that already knew its thread.",
        "properties": {
          "already_connected": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Connected"
          },
          "already_following": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Following"
          },
          "can_send_message": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Can Send Message"
          },
          "conversation_urn": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Conversation Urn"
          },
          "found_already": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInFoundAlready"
              },
              {
                "type": "null"
              }
            ]
          },
          "invitation_pending": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invitation Pending"
          },
          "kind": {
            "const": "send_message",
            "default": "send_message",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "member_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 8,
            "title": "Member Urns",
            "type": "array"
          },
          "open_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open Profile"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "profile_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Resolved"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "vanity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity"
          }
        },
        "title": "SendMessageOutcome",
        "type": "object"
      },
      "SendMessageParams": {
        "additionalProperties": false,
        "description": "Send a direct message, either from a profile or into an existing thread.\n\nTwo producers disagree about where a message goes, and both are right: a\nsequence step knows only the contact's profile, while a reply from the\nOneprofile inbox knows the thread and not the profile. Rather than make\nevery field optional and hope, the validator requires at least one usable\ntarget. ``member_urn`` travels with a thread reply because the messaging\npage shows no profile to read it off; the browser hands it back unchanged\nas the outcome's ``member_urn``, which is what the conversation row is\nkeyed on.\n\n``body_original_length`` follows the rule ``note_original_length`` sets on\na connection request: the body was cut exactly when it is longer than\n``body``.",
        "properties": {
          "body": {
            "maxLength": 8000,
            "title": "Body",
            "type": "string"
          },
          "body_original_length": {
            "default": 0,
            "minimum": 0.0,
            "title": "Body Original Length",
            "type": "integer"
          },
          "conversation_urn": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Conversation Urn"
          },
          "kind": {
            "const": "send_message",
            "default": "send_message",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "profile_url": {
            "anyOf": [
              {
                "maxLength": 512,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Url"
          }
        },
        "required": [
          "body"
        ],
        "title": "SendMessageParams",
        "type": "object"
      },
      "SendToTableSettings": {
        "description": "Settings for the send-to-table action: where the row goes.",
        "properties": {
          "kind": {
            "const": "send_to_table",
            "default": "send_to_table",
            "title": "Kind",
            "type": "string"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table each row is appended to.",
            "title": "Table Id"
          },
          "target_column": {
            "default": "",
            "description": "The column in that table this row's value is written to.",
            "maxLength": 255,
            "title": "Target Column",
            "type": "string"
          }
        },
        "title": "SendToTableSettings",
        "type": "object"
      },
      "SenderLeaderboardReadSchema": {
        "properties": {
          "linkedin_rows": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/LinkedInSenderLeaderboardRowReadSchema"
            },
            "title": "Linkedin Rows",
            "type": "array"
          },
          "refreshed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Refreshed At"
          },
          "refreshing": {
            "default": false,
            "description": "True when the board was more than five minutes old and a refresh is running in the background. Read it again a few seconds later for newer numbers and a newer refreshed_at.",
            "title": "Refreshing",
            "type": "boolean"
          },
          "rows": {
            "items": {
              "$ref": "#/components/schemas/SenderLeaderboardRowReadSchema"
            },
            "title": "Rows",
            "type": "array"
          }
        },
        "required": [
          "rows",
          "refreshed_at"
        ],
        "title": "SenderLeaderboardReadSchema",
        "type": "object"
      },
      "SenderLeaderboardRowReadSchema": {
        "properties": {
          "bounce_rate": {
            "title": "Bounce Rate",
            "type": "number"
          },
          "bounces": {
            "title": "Bounces",
            "type": "integer"
          },
          "contacted": {
            "default": 0,
            "title": "Contacted",
            "type": "integer"
          },
          "declines": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Replies to this mailbox's sends that said no without asking to stop; null when they could not be attributed.",
            "title": "Declines"
          },
          "mailbox_email": {
            "title": "Mailbox Email",
            "type": "string"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mailbox Id"
          },
          "opt_outs": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Opt Outs"
          },
          "positive": {
            "default": 0,
            "title": "Positive",
            "type": "integer"
          },
          "replies": {
            "title": "Replies",
            "type": "integer"
          },
          "reply_rate": {
            "title": "Reply Rate",
            "type": "number"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sender Profile Id"
          },
          "sender_profile_name": {
            "title": "Sender Profile Name",
            "type": "string"
          },
          "sent": {
            "title": "Sent",
            "type": "integer"
          }
        },
        "required": [
          "sender_profile_id",
          "sender_profile_name",
          "mailbox_id",
          "mailbox_email",
          "sent",
          "replies",
          "bounces",
          "reply_rate",
          "bounce_rate"
        ],
        "title": "SenderLeaderboardRowReadSchema",
        "type": "object"
      },
      "SenderLinkedInUsageSchema": {
        "description": "Today's LinkedIn steps of one kind against its daily limit.",
        "properties": {
          "daily_limit": {
            "title": "Daily Limit",
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/LinkedInActionKind"
          },
          "used_today": {
            "title": "Used Today",
            "type": "integer"
          }
        },
        "required": [
          "kind",
          "used_today",
          "daily_limit"
        ],
        "title": "SenderLinkedInUsageSchema",
        "type": "object"
      },
      "SenderProfileBulkUpdateResponseSchema": {
        "properties": {
          "updated": {
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated"
        ],
        "title": "SenderProfileBulkUpdateResponseSchema",
        "type": "object"
      },
      "SenderProfileBulkUpdateSchema": {
        "description": "One edit applied to many senders: the Senders list's bulk action.\n\nA field omitted from the request is left unchanged on every sender; a\nfield sent explicitly (even as an empty string) is applied to all of them.",
        "properties": {
          "first_name": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {}
            ],
            "title": "First Name"
          },
          "last_name": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {}
            ],
            "title": "Last Name"
          },
          "profile_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 500,
            "minItems": 1,
            "title": "Profile Ids",
            "type": "array"
          },
          "signature_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {}
            ],
            "description": "Plain-text signature appended to every send.",
            "title": "Signature Text"
          }
        },
        "required": [
          "profile_ids"
        ],
        "title": "SenderProfileBulkUpdateSchema",
        "type": "object"
      },
      "SenderProfileCreateSchema": {
        "description": "A sender is a person, so a person's name is all it takes to create one.\n\nThe workspace-unique display name is derived from these two. There is no\nseparate name to type, and therefore no way for it to disagree with the\nfirst and last name the messages themselves are signed with.",
        "properties": {
          "first_name": {
            "description": "The sender's first name.",
            "maxLength": 128,
            "minLength": 1,
            "title": "First Name",
            "type": "string"
          },
          "last_name": {
            "default": "",
            "description": "The sender's last name.",
            "maxLength": 128,
            "title": "Last Name",
            "type": "string"
          },
          "signature_text": {
            "default": "",
            "description": "Plain-text signature appended to every send as this profile.",
            "title": "Signature Text",
            "type": "string"
          },
          "timezone": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The creating browser's IANA timezone, kept as a guess that only a person changes after. One this server does not know is dropped.",
            "title": "Timezone"
          }
        },
        "required": [
          "first_name"
        ],
        "title": "SenderProfileCreateSchema",
        "type": "object"
      },
      "SenderProfileMailboxesPutSchema": {
        "properties": {
          "mailbox_ids": {
            "description": "The exact set of mailboxes this profile sends from.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Mailbox Ids",
            "type": "array"
          }
        },
        "required": [
          "mailbox_ids"
        ],
        "title": "SenderProfileMailboxesPutSchema",
        "type": "object"
      },
      "SenderProfileMailboxesSetSchema": {
        "description": "The mailboxes a sender sends from: the whole set, as stored.",
        "properties": {
          "data": {
            "description": "The ids of the sender's mailboxes, by email address.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Data",
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "title": "SenderProfileMailboxesSetSchema",
        "type": "object"
      },
      "SenderProfileReadSchema": {
        "properties": {
          "booking_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The link people use to book a meeting with this sender, such as a Calendly or Cal.com page. It is what the {{Sender booking link}} variable is replaced with. Null when none is set.",
            "title": "Booking Url"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "daily_limit": {
            "default": 0,
            "title": "Daily Limit",
            "type": "integer"
          },
          "email_approval_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EmailApprovalMode"
              },
              {
                "type": "null"
              }
            ],
            "description": "manual | auto; null inherits the workspace's email approval mode."
          },
          "first_name": {
            "default": "",
            "title": "First Name",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_name": {
            "default": "",
            "title": "Last Name",
            "type": "string"
          },
          "linkedin_checkpoint": {
            "default": false,
            "description": "True while LinkedIn is asking this sender to verify the account.",
            "title": "Linkedin Checkpoint",
            "type": "boolean"
          },
          "linkedin_connection_request_cap": {
            "default": 0,
            "title": "Linkedin Connection Request Cap",
            "type": "integer"
          },
          "linkedin_connection_requests_today": {
            "default": 0,
            "title": "Linkedin Connection Requests Today",
            "type": "integer"
          },
          "linkedin_identity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Identity"
          },
          "linkedin_last_seen_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a browser for this sender last checked in.",
            "title": "Linkedin Last Seen At"
          },
          "linkedin_photo_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Photo Url"
          },
          "linkedin_presence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInPresence"
              },
              {
                "type": "null"
              }
            ]
          },
          "linkedin_run_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInApprovalMode"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender's LinkedIn approval setting in force: manual (a person approves each step on Tasks before it runs) or auto. Null when no LinkedIn account is connected."
          },
          "linkedin_usage": {
            "description": "Today's LinkedIn steps against each kind's daily limit.",
            "items": {
              "$ref": "#/components/schemas/SenderLinkedInUsageSchema"
            },
            "title": "Linkedin Usage",
            "type": "array"
          },
          "mailbox_count": {
            "title": "Mailbox Count",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "send_mode": {
            "$ref": "#/components/schemas/SenderSendMode",
            "description": "Whether the messages the agent writes for this sender go out on their own or wait for a person, replies included. Always send (`always_send`): every message the agent writes goes out on its own. Send when confident (`send_when_confident`, the default): a message goes out when the agent rates its own message high and had enough data, and waits for a person otherwise. Always ask (`always_ask`): a person approves every one. A sequence set to ask first still asks, whichever mode its senders are on."
          },
          "sent_today": {
            "default": 0,
            "title": "Sent Today",
            "type": "integer"
          },
          "signature_text": {
            "default": "",
            "title": "Signature Text",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/SenderProfileStatus"
          },
          "timezone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender's IANA timezone, such as America/New_York. Their daily limits reset at its midnight, and a sequence sending in each sender's timezone sends in its hours. Null until it is detected or chosen.",
            "title": "Timezone"
          },
          "timezone_source": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TimezoneSource"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the timezone came from: `guessed` from whoever created the sender or the sequences it sent for, `browser` from the browser driving the sender's LinkedIn when the sender had none, `person` chosen by someone. Detection only fills an empty timezone and never moves one a sender has."
          },
          "title": {
            "description": "The sender's job title, as their messages introduce them. It is what the {{Sender title}} variable is replaced with. Empty when none is set.",
            "title": "Title",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "mailbox_count",
          "send_mode",
          "title",
          "booking_url",
          "created_at",
          "updated_at"
        ],
        "title": "SenderProfileReadSchema",
        "type": "object"
      },
      "SenderProfileStatus": {
        "description": "Lifecycle of a sender.\n\nA sender is DRAFT from the moment it is created and becomes ACTIVE once at\nleast one mailbox is attached. The status is derived from attachment, never\nstored, so it cannot drift.",
        "enum": [
          "draft",
          "active"
        ],
        "title": "SenderProfileStatus",
        "type": "string"
      },
      "SenderProfileUpdateSchema": {
        "description": "A field omitted from the request is left unchanged.",
        "properties": {
          "booking_url": {
            "anyOf": [
              {
                "maxLength": 2048,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The link people use to book a meeting with this sender. It has to be a full web address starting with http:// or https://. Null or an empty string removes it. Only a person signed in to Oneprofile can change it.",
            "title": "Booking Url"
          },
          "confirm": {
            "default": false,
            "description": "Set to true to confirm that this sender's messages may go out without anyone reading them first. Required when `send_mode` is `always_send`; ignored otherwise.",
            "title": "Confirm",
            "type": "boolean"
          },
          "email_approval_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EmailApprovalMode"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "manual | auto to override the workspace's email approval mode for this sender; null to inherit it again. Only a person signed in to Oneprofile can change it; an API key cannot.",
            "title": "Email Approval Mode"
          },
          "first_name": {
            "anyOf": [
              {
                "maxLength": 128,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "title": "First Name"
          },
          "last_name": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {}
            ],
            "title": "Last Name"
          },
          "send_mode": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SenderSendMode"
              },
              {}
            ],
            "description": "Whether the messages the agent writes for this sender go out on their own or wait for a person, replies included. Always send (`always_send`): every message the agent writes goes out on its own. Send when confident (`send_when_confident`, the default): a message goes out when the agent rates its own message high and had enough data, and waits for a person otherwise. Always ask (`always_ask`): a person approves every one. A sequence set to ask first still asks, whichever mode its senders are on. Only a person signed in to Oneprofile can change it; an API key can read it but not change it. Only a workspace admin can choose Always send, and only with `confirm` set to true. Moving to Send when confident or Always ask needs neither. Leave it out of the request unless you are changing it.",
            "title": "Send Mode"
          },
          "signature_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {}
            ],
            "description": "Plain-text signature appended to every send.",
            "title": "Signature Text"
          },
          "timezone": {
            "anyOf": [
              {
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The sender's IANA timezone, such as America/New_York, as a person chooses it: their daily limits reset at its midnight and sequences send in its hours. Once chosen, nothing detected replaces it. Null returns the sender to the detected zone. Sending the zone it already has changes nothing.",
            "title": "Timezone"
          },
          "title": {
            "anyOf": [
              {
                "maxLength": 120,
                "type": "string"
              },
              {}
            ],
            "description": "The sender's job title, one line of up to 120 characters, as their messages introduce them. An empty string removes it. Only a person signed in to Oneprofile can change it.",
            "title": "Title"
          }
        },
        "title": "SenderProfileUpdateSchema",
        "type": "object"
      },
      "SenderSendMode": {
        "description": "How much of this sender's agent-written email leaves without a person.\n\n``ALWAYS_SEND``: agent-written email steps and replies go out unattended\nunless a defect is found in the message itself. ``SEND_WHEN_CONFIDENT``:\nthey go out when the agent's confidence rule holds, and a person is asked\nwhen it does not. ``ALWAYS_ASK``: every agent-written email waits for a\nperson, whatever the agent thinks of it.\n\nThe three are ordered by strictness (ALWAYS_ASK strictest, then\nSEND_WHEN_CONFIDENT, then ALWAYS_SEND loosest), and that order is what\n``service.strictest_send_mode`` folds a cadence's assigned senders down\nwith. The order is the point: everything that combines two modes must\nresolve towards asking, never towards sending.\n\nReplaces ``EmailApprovalMode``'s two-way choice, which cannot express\n\"send the ones the agent stands behind\". That enum and its column stay\nuntil a release backfills this one; do not read both in one decision.",
        "enum": [
          "always_send",
          "send_when_confident",
          "always_ask"
        ],
        "title": "SenderSendMode",
        "type": "string"
      },
      "SendingDaysSchema": {
        "additionalProperties": false,
        "description": "The days a sequence may send on. A day left out, or null, is closed.",
        "properties": {
          "fri": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingHoursSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "mon": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingHoursSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "sat": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingHoursSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "sun": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingHoursSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "thu": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingHoursSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "tue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingHoursSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "wed": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingHoursSchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "title": "SendingDaysSchema",
        "type": "object"
      },
      "SendingHoursSchema": {
        "additionalProperties": false,
        "description": "One open day's sending hours, read on the window's timezone.",
        "properties": {
          "end": {
            "description": "When it closes, as HH:MM, after start on the same day. Hours cannot run past midnight, so 23:59 is the latest close.",
            "maxLength": 16,
            "minLength": 1,
            "title": "End",
            "type": "string"
          },
          "start": {
            "description": "When sending opens, as HH:MM on a 24-hour clock, such as 09:00.",
            "maxLength": 16,
            "minLength": 1,
            "title": "Start",
            "type": "string"
          }
        },
        "required": [
          "start",
          "end"
        ],
        "title": "SendingHoursSchema",
        "type": "object"
      },
      "SendingWindowProblemSchema": {
        "description": "A rule the saved sending window breaks, and where.",
        "properties": {
          "field": {
            "description": "Where in sending_window it is, as its keys spell it: ['timezone'], ['days'], ['days', 'mon'], ['days', 'mon', 'start'] or ['min_interval_minutes']; empty when the window as a whole cannot be read.",
            "items": {
              "type": "string"
            },
            "title": "Field",
            "type": "array"
          },
          "message": {
            "description": "What is wrong and what to change, in the product's words.",
            "title": "Message",
            "type": "string"
          }
        },
        "required": [
          "field",
          "message"
        ],
        "title": "SendingWindowProblemSchema",
        "type": "object"
      },
      "SendingWindowSchema": {
        "additionalProperties": false,
        "description": "When a sequence may send, as the send engine reads it.\n\nWithout ``days`` it sends at any hour of any day, which is the settings\npage's Send any time: it keeps its timezone and its minimum gap between\nemails. Every rule here is checked on save, running or not, and a window\nthat breaks one is refused with a 422 naming the part at fault.",
        "properties": {
          "days": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingDaysSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The days it may send on, each with its hours. Leave it out to send at any hour; given, at least one day must be open."
          },
          "min_interval_minutes": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The shortest gap between two emails from one mailbox, a whole number from 0 to 240 minutes. Null or 0 spaces them automatically from each mailbox's daily capacity.",
            "maximum": 240.0,
            "minimum": 0.0,
            "title": "Min Interval Minutes"
          },
          "sender_timezone": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the hours are read in each sender's own timezone, so a New York sender and a London one each send 9 to 5 their time. False reads them in `timezone` for everyone. Absent or null means each sender's; an update that leaves it out keeps what is stored.",
            "title": "Sender Timezone"
          },
          "timezone": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The IANA timezone the hours are read in, such as Europe/Berlin: the one timezone when `sender_timezone` is false, else the fallback for a sender with none. UTC when absent.",
            "title": "Timezone"
          }
        },
        "title": "SendingWindowSchema",
        "type": "object"
      },
      "SentLooksGoodReadSchema": {
        "description": "Looks good on a message the agent sent, and the learning its Needs work proposed, saved.",
        "properties": {
          "message_id": {
            "description": "The message that went out.",
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          },
          "saved_learnings": {
            "description": "How many changes to the agent's learnings this Looks good saved: those a Needs work on the message proposed. 0 when none waited, or when the list a change joins is full, so it stays proposed while the Looks good is still recorded.",
            "title": "Saved Learnings",
            "type": "integer"
          },
          "saved_learnings_for_all_sequences": {
            "description": "Of saved_learnings, how many apply to every sequence, not only this one.",
            "title": "Saved Learnings For All Sequences",
            "type": "integer"
          }
        },
        "required": [
          "message_id",
          "saved_learnings",
          "saved_learnings_for_all_sequences"
        ],
        "title": "SentLooksGoodReadSchema",
        "type": "object"
      },
      "SentMessageSubjectSchema": {
        "description": "A message the agent wrote that went out.",
        "properties": {
          "kind": {
            "const": "sent_message",
            "title": "Kind",
            "type": "string"
          },
          "message_id": {
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "message_id"
        ],
        "title": "SentMessageSubjectSchema",
        "type": "object"
      },
      "SentOn": {
        "description": "Which of a mailbox's days the Mailboxes grid narrows to: its sender's today or yesterday.",
        "enum": [
          "today",
          "yesterday"
        ],
        "title": "SentOn",
        "type": "string"
      },
      "SentStepEmailReadSchema": {
        "description": "The email a step got out to one contact, as it went.",
        "properties": {
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The email's words as they were sent, without the signature and opt-out footer the send added below them.",
            "title": "Body"
          },
          "email_html": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The email's HTML part exactly as it was handed to Gmail: the words, the sender's signature and the opt-out footer, every line, blank line and space as the contact got them. Null for a send from before the send kept its email.",
            "title": "Email Html"
          },
          "sent_at": {
            "format": "date-time",
            "title": "Sent At",
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          }
        },
        "required": [
          "subject",
          "body",
          "sent_at"
        ],
        "title": "SentStepEmailReadSchema",
        "type": "object"
      },
      "SequenceAgentCopySchema": {
        "description": "Which sequence's agent setup to copy onto this sequence's agent.",
        "properties": {
          "from_sequence_id": {
            "description": "The sequence whose agent setup is copied. Must be another of this workspace's.",
            "format": "uuid",
            "title": "From Sequence Id",
            "type": "string"
          }
        },
        "required": [
          "from_sequence_id"
        ],
        "title": "SequenceAgentCopySchema",
        "type": "object"
      },
      "SequenceAgentExampleReadSchema": {
        "description": "Persisted message copy and its human review outcomes.",
        "properties": {
          "agent_version": {
            "title": "Agent Version",
            "type": "integer"
          },
          "approved": {
            "title": "Approved",
            "type": "boolean"
          },
          "body": {
            "title": "Body",
            "type": "string"
          },
          "contact_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contact Label"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "declined": {
            "title": "Declined",
            "type": "boolean"
          },
          "edited": {
            "title": "Edited",
            "type": "boolean"
          },
          "id": {
            "description": "The message's id.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_sample": {
            "title": "Is Sample",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/MessageKind"
          },
          "original_body": {
            "title": "Original Body",
            "type": "string"
          },
          "original_subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Original Subject"
          },
          "preview": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceAgentPreviewReadSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "slot_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slot Key"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          }
        },
        "required": [
          "id",
          "slot_key",
          "record_id",
          "contact_label",
          "kind",
          "subject",
          "body",
          "original_subject",
          "original_body",
          "is_sample",
          "approved",
          "edited",
          "declined",
          "agent_version",
          "created_at"
        ],
        "title": "SequenceAgentExampleReadSchema",
        "type": "object"
      },
      "SequenceAgentPreviewFindingReadSchema": {
        "description": "One thing the checks noticed about the preview's words.",
        "properties": {
          "code": {
            "title": "Code",
            "type": "string"
          },
          "excerpt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Excerpt"
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "severity": {
            "description": "warning (likely hurts) or info (worth knowing).",
            "title": "Severity",
            "type": "string"
          }
        },
        "required": [
          "code",
          "severity",
          "message"
        ],
        "title": "SequenceAgentPreviewFindingReadSchema",
        "type": "object"
      },
      "SequenceAgentPreviewReadSchema": {
        "description": "One message the agent wrote for one contact as a preview.\n\nNobody receives it. Sender variables such as `{{Sender first name}}` are\nleft in place: they are filled in for whichever mailbox sends the real\nmessage.",
        "properties": {
          "agent_version": {
            "description": "The saved agent version that wrote this sample.",
            "title": "Agent Version",
            "type": "integer"
          },
          "angle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The hook the message leads with.",
            "title": "Angle"
          },
          "body": {
            "title": "Body",
            "type": "string"
          },
          "cached": {
            "description": "True when the same preview was already written today and is shown again at no further cost.",
            "title": "Cached",
            "type": "boolean"
          },
          "comparison_context": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PreviewComparisonContext"
              },
              {
                "type": "null"
              }
            ],
            "description": "Recorded input identities; absent on samples written before tracking began."
          },
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageConfidence"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's own read on whether the message is ready to send unedited."
          },
          "confidence_score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The same read as a score from 0 to 100.",
            "title": "Confidence Score"
          },
          "confident": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the message would be trusted to send on its own under a sender set to send when confident.",
            "title": "Confident"
          },
          "created_at": {
            "description": "When this sample was first written.",
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "facts_offered": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many facts from the contact's row the agent was handed for this sample: the row's cells and the prepared angles from its research and AI columns, as bounded. Null on samples written before it was recorded.",
            "title": "Facts Offered"
          },
          "facts_used": {
            "description": "The facts about the contact the message is built on.",
            "items": {
              "type": "string"
            },
            "title": "Facts Used",
            "type": "array"
          },
          "findings": {
            "description": "What the checks noticed: spam phrases, placeholders, claims nobody can back.",
            "items": {
              "$ref": "#/components/schemas/SequenceAgentPreviewFindingReadSchema"
            },
            "title": "Findings",
            "type": "array"
          },
          "insufficient_data": {
            "description": "True when the agent said the contact's row gave it too little to go on.",
            "title": "Insufficient Data",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/MessageKind",
            "description": "Which kind of message the step sends."
          },
          "message_id": {
            "description": "The preview's id; rate it through the agent's feedback like any message.",
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          },
          "profile_read": {
            "default": false,
            "description": "True when the agent read the contact's LinkedIn profile for this preview.",
            "title": "Profile Read",
            "type": "boolean"
          },
          "reach": {
            "$ref": "#/components/schemas/AgentReach",
            "description": "`web` when the agent researched the contact on the web for this preview."
          },
          "reasoning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's reason for its confidence, given after it wrote the message.",
            "title": "Reasoning"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The subject; null when the message follows the previous email in its thread.",
            "title": "Subject"
          },
          "written_as": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who the preview is written as, by name and title, when the sequence has two or more senders; null with one, when there is nobody to tell apart.",
            "title": "Written As"
          }
        },
        "required": [
          "message_id",
          "agent_version",
          "created_at",
          "kind",
          "subject",
          "body",
          "confidence",
          "confidence_score",
          "confident",
          "reasoning",
          "insufficient_data",
          "facts_used",
          "angle",
          "findings",
          "reach",
          "cached"
        ],
        "title": "SequenceAgentPreviewReadSchema",
        "type": "object"
      },
      "SequenceAgentPreviewRequestSchema": {
        "description": "Which message to preview, for which contact.",
        "properties": {
          "fresh": {
            "default": false,
            "description": "Write a new message instead of showing the one already written for this step, contact and agent version. Set it when someone asks for another example: without it the same ask the same day is answered from what was written before, so a second ask returns the first message word for word. For a contact the sequence has not written to yet, a fresh write writes the contact's whole sequence again from its first step; it takes the daily preview allowance for each step it writes.",
            "title": "Fresh",
            "type": "boolean"
          },
          "record_id": {
            "description": "The contact: a row of the sequence's audience table.",
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "step_id": {
            "description": "An agent-written step of this sequence: the one the `result` frame carries. The rest of the contact's sequence is written with it.",
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          }
        },
        "required": [
          "step_id",
          "record_id"
        ],
        "title": "SequenceAgentPreviewRequestSchema",
        "type": "object"
      },
      "SequenceAgentPreviewStopResponseSchema": {
        "description": "A Stop was asked for. Whether it lands is the stream's to say.\n\nThe request is cooperative and best effort: the preview reads it before each\nmodel call and while the model writes, and a preview that has already\nfinished is not affected. The stream reports a Stop that landed as an `error`\nframe with reason `stopped`.",
        "properties": {
          "preview_id": {
            "format": "uuid",
            "title": "Preview Id",
            "type": "string"
          }
        },
        "required": [
          "preview_id"
        ],
        "title": "SequenceAgentPreviewStopResponseSchema",
        "type": "object"
      },
      "SequenceAgentReadSchema": {
        "description": "The sequence's outbound agent: the setup its agent-written steps and replies use.",
        "properties": {
          "config": {
            "$ref": "#/components/schemas/OutboundAgentConfig",
            "description": "Its goal, call to action, language, per-step prompts, reply prompt and whether it drafts replies."
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "description": "The agent's id, as the /outbound-agents/ routes address it.",
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "model_key": {
            "description": "The model it writes with: swift, core or deep.",
            "title": "Model Key",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "research": {
            "description": "Whether the first message to a contact may research them on the web.",
            "title": "Research",
            "type": "boolean"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "version": {
            "description": "The configuration's version; every change writes a new one.",
            "title": "Version",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "name",
          "version",
          "model_key",
          "research",
          "config",
          "created_at",
          "updated_at"
        ],
        "title": "SequenceAgentReadSchema",
        "type": "object"
      },
      "SequenceAnalyticsReadSchema": {
        "description": "No open or click rate, by construction: plain text has nothing to instrument.",
        "properties": {
          "agent_labels_since": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the agent first labelled a reply here, the day positive changed meaning: before it every Positive was a person's. None when the agent has labelled none.",
            "title": "Agent Labels Since"
          },
          "bounce_rate": {
            "description": "bounced divided by emailed.",
            "title": "Bounce Rate",
            "type": "number"
          },
          "bounced": {
            "title": "Bounced",
            "type": "integer"
          },
          "connection_requests": {
            "default": 0,
            "title": "Connection Requests",
            "type": "integer"
          },
          "contacted": {
            "description": "Distinct people reached on any channel: sent an email, sent a LinkedIn message or InMail, or who accepted a connection request. A request still pending, a profile view, a follow or a like reaches nobody. The rates' denominator, bounce_rate's apart.",
            "title": "Contacted",
            "type": "integer"
          },
          "decline_rate": {
            "default": 0.0,
            "description": "declined divided by contacted.",
            "title": "Decline Rate",
            "type": "number"
          },
          "declined": {
            "default": 0,
            "description": "Contacts a reply stopped by saying no without asking to stop, over all time. Never counted in unsubscribed, and counted in replied.",
            "title": "Declined",
            "type": "integer"
          },
          "emailed": {
            "default": 0,
            "description": "Distinct people sent an email: bounce_rate's denominator.",
            "title": "Emailed",
            "type": "integer"
          },
          "first_touch": {
            "default": 0,
            "title": "First Touch",
            "type": "integer"
          },
          "followed_up": {
            "default": 0,
            "title": "Followed Up",
            "type": "integer"
          },
          "linkedin_messages": {
            "default": 0,
            "title": "Linkedin Messages",
            "type": "integer"
          },
          "opt_out_rate": {
            "description": "unsubscribed divided by contacted.",
            "title": "Opt Out Rate",
            "type": "number"
          },
          "pipeline_value": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pipeline Value"
          },
          "positive": {
            "default": 0,
            "description": "Conversations wearing a label that counts as positive. The agent's own Positive counts only where the contact clearly showed interest; a person's label always counts.",
            "title": "Positive",
            "type": "integer"
          },
          "positive_rate": {
            "default": 0.0,
            "description": "positive divided by contacted.",
            "title": "Positive Rate",
            "type": "number"
          },
          "profile_views": {
            "default": 0,
            "title": "Profile Views",
            "type": "integer"
          },
          "refreshed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Refreshed At"
          },
          "refreshing": {
            "default": false,
            "description": "True when these numbers were more than five minutes old and a refresh is running in the background. Read them again a few seconds later for newer numbers and a newer refreshed_at.",
            "title": "Refreshing",
            "type": "boolean"
          },
          "replied": {
            "title": "Replied",
            "type": "integer"
          },
          "reply_rate": {
            "description": "replied divided by contacted.",
            "title": "Reply Rate",
            "type": "number"
          },
          "sent": {
            "title": "Sent",
            "type": "integer"
          },
          "series": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsPointReadSchema"
            },
            "title": "Series",
            "type": "array"
          },
          "unsubscribed": {
            "title": "Unsubscribed",
            "type": "integer"
          }
        },
        "required": [
          "contacted",
          "replied",
          "sent",
          "bounced",
          "unsubscribed",
          "reply_rate",
          "bounce_rate",
          "opt_out_rate",
          "series"
        ],
        "title": "SequenceAnalyticsReadSchema",
        "type": "object"
      },
      "SequenceAssistantAppliedContextSchema": {
        "description": "Context for a roster change an AI made through a granted workspace action.",
        "properties": {
          "enrolled": {
            "default": 0,
            "title": "Enrolled",
            "type": "integer"
          },
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "proposal_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Proposal Id"
          },
          "summary": {
            "default": "",
            "title": "Summary",
            "type": "string"
          },
          "type": {
            "const": "assistant_applied",
            "default": "assistant_applied",
            "title": "Type",
            "type": "string"
          },
          "verb": {
            "default": "",
            "title": "Verb",
            "type": "string"
          }
        },
        "title": "SequenceAssistantAppliedContextSchema",
        "type": "object"
      },
      "SequenceAssistantUndoneContextSchema": {
        "description": "Context for the reversal of an assistant's roster change.\n\nHistory only: undo was taken out of the assistant and nothing writes\nthis any more. It stays so trails written before that still read back.",
        "properties": {
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "proposal_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Proposal Id"
          },
          "removed": {
            "default": 0,
            "title": "Removed",
            "type": "integer"
          },
          "type": {
            "const": "assistant_undone",
            "default": "assistant_undone",
            "title": "Type",
            "type": "string"
          },
          "verb": {
            "default": "",
            "title": "Verb",
            "type": "string"
          }
        },
        "title": "SequenceAssistantUndoneContextSchema",
        "type": "object"
      },
      "SequenceAuditAction": {
        "description": "What happened to a sequence.\n\nNamed lifecycle events rather than a created/updated/deleted triad,\nbecause launch, pause and resume ARE the questions this trail exists to\nanswer. Deriving them from a status field-change would make every reader\nre-infer intent, and an engine pause carries a reason that is not a\nfield diff at all.\n\nOne action means exactly one context shape here. That is the property the\nenrichment trail lost when three different things all came to be stored\nas ``run_requested``, which is why its ``action`` can no longer tell a\nCSV download from an enrichment run. Keep it one-to-one.",
        "enum": [
          "created",
          "edited",
          "launched",
          "paused",
          "resumed",
          "deleted",
          "trashed",
          "restored",
          "purged",
          "assistant_applied",
          "browser_outputs_revealed",
          "assistant_undone",
          "unrecognised"
        ],
        "title": "SequenceAuditAction",
        "type": "string"
      },
      "SequenceAuditLogReadSchema": {
        "description": "One entry in a sequence's activity trail.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/SequenceAuditAction"
          },
          "actor": {
            "title": "Actor",
            "type": "string"
          },
          "actor_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Actor Display Name"
          },
          "actor_type": {
            "$ref": "#/components/schemas/ActorKind"
          },
          "context": {
            "discriminator": {
              "mapping": {
                "assistant_applied": "#/components/schemas/SequenceAssistantAppliedContextSchema",
                "assistant_undone": "#/components/schemas/SequenceAssistantUndoneContextSchema",
                "browser_outputs_revealed": "#/components/schemas/SequenceBrowserOutputsRevealedContextSchema",
                "created": "#/components/schemas/SequenceCreatedContextSchema",
                "deleted": "#/components/schemas/SequenceDeletedContextSchema",
                "edited": "#/components/schemas/SequenceEditedContextSchema",
                "launched": "#/components/schemas/SequenceLaunchedContextSchema",
                "paused": "#/components/schemas/SequencePausedContextSchema",
                "purged": "#/components/schemas/SequencePurgedContextSchema",
                "restored": "#/components/schemas/SequenceRestoredContextSchema",
                "resumed": "#/components/schemas/SequenceResumedContextSchema",
                "trashed": "#/components/schemas/SequenceTrashedContextSchema",
                "unrecognised": "#/components/schemas/UnrecognisedSequenceContextSchema"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/SequenceCreatedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceEditedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceLaunchedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequencePausedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceResumedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceDeletedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceTrashedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceRestoredContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequencePurgedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceAssistantAppliedContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceAssistantUndoneContextSchema"
              },
              {
                "$ref": "#/components/schemas/SequenceBrowserOutputsRevealedContextSchema"
              },
              {
                "$ref": "#/components/schemas/UnrecognisedSequenceContextSchema"
              }
            ],
            "title": "Context"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "proposal_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Proposal Id"
          },
          "sequence_id": {
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "sequence_id",
          "action",
          "actor_type",
          "actor",
          "context",
          "created_at"
        ],
        "title": "SequenceAuditLogReadSchema",
        "type": "object"
      },
      "SequenceBrowserOutputsRevealedContextSchema": {
        "description": "A person read the values a Browser use run kept out of sight; which ones, not what.",
        "properties": {
          "contact_name": {
            "default": "",
            "description": "The contact's name off their row when shown; empty when it names nobody.",
            "title": "Contact Name",
            "type": "string"
          },
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "output_keys": {
            "items": {
              "type": "string"
            },
            "title": "Output Keys",
            "type": "array"
          },
          "output_names": {
            "description": "The values' names as they read when shown, in output_keys' order.",
            "items": {
              "type": "string"
            },
            "title": "Output Names",
            "type": "array"
          },
          "record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Record Id"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Run Id"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Id"
          },
          "trial": {
            "default": false,
            "title": "Trial",
            "type": "boolean"
          },
          "type": {
            "const": "browser_outputs_revealed",
            "default": "browser_outputs_revealed",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequenceBrowserOutputsRevealedContextSchema",
        "type": "object"
      },
      "SequenceBrowserStepCostReadSchema": {
        "description": "One Browser use step's runs that opened a browser: their contacts and charge.",
        "properties": {
          "charged_tenths": {
            "description": "What those runs charged in all, in tenths.",
            "title": "Charged Tenths",
            "type": "integer"
          },
          "contacts": {
            "description": "Contacts its settled runs that opened a browser ran for, each once; its Try runs' contacts until it has a real run.",
            "title": "Contacts",
            "type": "integer"
          },
          "step_id": {
            "description": "The Browser use step.",
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          }
        },
        "required": [
          "step_id",
          "contacts",
          "charged_tenths"
        ],
        "title": "SequenceBrowserStepCostReadSchema",
        "type": "object"
      },
      "SequenceBudgetReadSchema": {
        "properties": {
          "charged_tenths": {
            "description": "What the sequence has actually spent, in tenths.",
            "title": "Charged Tenths",
            "type": "integer"
          },
          "limit_tenths": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sequence's spending cap in tenths of a credit, or null when it has no cap.",
            "title": "Limit Tenths"
          },
          "reserved_tenths": {
            "description": "Held against work already claimed but not yet settled, in tenths.",
            "title": "Reserved Tenths",
            "type": "integer"
          }
        },
        "required": [
          "limit_tenths",
          "charged_tenths",
          "reserved_tenths"
        ],
        "title": "SequenceBudgetReadSchema",
        "type": "object"
      },
      "SequenceBulkUpdateResponseSchema": {
        "description": "Which sequences a bulk change actually changed.",
        "properties": {
          "sequence_ids": {
            "description": "The sequences changed. One already there, missing or in Trash is left out.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Sequence Ids",
            "type": "array"
          },
          "updated": {
            "description": "How many sequences changed.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "sequence_ids"
        ],
        "title": "SequenceBulkUpdateResponseSchema",
        "type": "object"
      },
      "SequenceBulkUpdateSchema": {
        "description": "Request body for changing the same fields of several sequences at once.",
        "properties": {
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Put them in this folder; null for the top level of the Sequences list. A running sequence keeps running, wherever it sits.",
            "title": "Folder Id"
          },
          "ids": {
            "description": "The sequences to change. One missing or in Trash is left out.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 500,
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          }
        },
        "required": [
          "ids",
          "folder_id"
        ],
        "title": "SequenceBulkUpdateSchema",
        "type": "object"
      },
      "SequenceCapacityReadSchema": {
        "description": "The combined daily capacity of the assigned senders.",
        "properties": {
          "connected_mailbox_count": {
            "title": "Connected Mailbox Count",
            "type": "integer"
          },
          "daily_ceiling": {
            "description": "Sum of every assigned, connected mailbox's daily send limit.",
            "title": "Daily Ceiling",
            "type": "integer"
          },
          "mailbox_count": {
            "title": "Mailbox Count",
            "type": "integer"
          },
          "remaining_today": {
            "description": "max(0, daily_ceiling - sent_today); zero if no sender is assigned or none of their mailboxes is connected.",
            "title": "Remaining Today",
            "type": "integer"
          },
          "sends_email": {
            "description": "Whether the sequence has any email step. False for a LinkedIn-only cadence, where mailbox capacity and runway do not apply and are not shown.",
            "title": "Sends Email",
            "type": "boolean"
          },
          "sent_today": {
            "title": "Sent Today",
            "type": "integer"
          }
        },
        "required": [
          "mailbox_count",
          "connected_mailbox_count",
          "daily_ceiling",
          "sent_today",
          "remaining_today",
          "sends_email"
        ],
        "title": "SequenceCapacityReadSchema",
        "type": "object"
      },
      "SequenceChangeGroupSchema": {
        "description": "The part of the sequence a review row is about, which the dialog groups its rows under.\n\nA step's rows sit under the step's name as the edit leaves it, with the\nname it had before when the edit renamed it (``was``), and ``state`` when\nthe edit adds or removes the whole step (Natsuki, 2026-10-08: the review\nreads as one list grouped by step and by tab, never one flat table).",
        "properties": {
          "key": {
            "description": "Stable within one review: the rows sharing it form one group.",
            "title": "Key",
            "type": "string"
          },
          "kind": {
            "enum": [
              "step",
              "connections",
              "writing",
              "writing_action",
              "audience",
              "senders",
              "settings"
            ],
            "title": "Kind",
            "type": "string"
          },
          "state": {
            "anyOf": [
              {
                "enum": [
                  "added",
                  "removed"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "State"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Id"
          },
          "step_kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceStepKind"
              },
              {
                "type": "null"
              }
            ],
            "description": "A step group's kind, for its icon."
          },
          "title": {
            "description": "The heading, as the screen that owns the part names it.",
            "title": "Title",
            "type": "string"
          },
          "was": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A step's name before the change, when the change renamed it.",
            "title": "Was"
          }
        },
        "required": [
          "key",
          "kind",
          "title"
        ],
        "title": "SequenceChangeGroupSchema",
        "type": "object"
      },
      "SequenceChangeReadSchema": {
        "properties": {
          "after": {
            "title": "After"
          },
          "before": {
            "title": "Before"
          },
          "field": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The stored field the row is about, so a screen that words that field itself (a sending window, a call to action link) can draw the value in its own words.",
            "title": "Field"
          },
          "group": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceChangeGroupSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "label": {
            "title": "Label",
            "type": "string"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The row's own name inside its group, without the group's.",
            "title": "Name"
          },
          "undo": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceChangeUndoSchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "label",
          "before",
          "after"
        ],
        "title": "SequenceChangeReadSchema",
        "type": "object"
      },
      "SequenceChangeUndoSchema": {
        "description": "Which part of the staged change set an Undo on the row takes back.\n\n``fields`` are the stored fields of the section (or of the step) the row\nis about; a connection names the way out by its step (None for the start)\nand its branch. The dialog puts each back as it stands on the sequence now.",
        "properties": {
          "branch": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceEdgeBranch"
              },
              {
                "type": "null"
              }
            ]
          },
          "fields": {
            "items": {
              "type": "string"
            },
            "title": "Fields",
            "type": "array"
          },
          "kind": {
            "enum": [
              "settings",
              "agent",
              "agent_config",
              "step",
              "step_added",
              "step_removed",
              "connection",
              "senders",
              "mapping",
              "audience",
              "writing_action"
            ],
            "title": "Kind",
            "type": "string"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Id"
          }
        },
        "required": [
          "kind"
        ],
        "title": "SequenceChangeUndoSchema",
        "type": "object"
      },
      "SequenceChangesPreviewSchema": {
        "properties": {
          "active_contacts": {
            "title": "Active Contacts",
            "type": "integer"
          },
          "approvals_released": {
            "default": 0,
            "description": "Cards waiting for approval in Tasks that the change lets go out without it, at most: those on a step whose approval it switches off, held only by the sequence's own approval for their channel, which it loosens, or held by a sender's own setting when it takes a sender off (that sender may have been the strictest). A card the remaining senders' setting or the agent's words on review still holds stays, and so does one a person edited and has not approved.",
            "title": "Approvals Released",
            "type": "integer"
          },
          "audience_restart": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AudienceRestartReviewSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set when the change replaces the audience and starts contacts over."
          },
          "changes": {
            "items": {
              "$ref": "#/components/schemas/SequenceChangeReadSchema"
            },
            "title": "Changes",
            "type": "array"
          },
          "finished_contacts_at_most": {
            "default": false,
            "description": "True when the two finished-contact counts are of who stands at those ends, the most that go on, rather than each contact judged: more stand there than the review judges one by one. They are judged when the change applies.",
            "title": "Finished Contacts At Most",
            "type": "boolean"
          },
          "finished_contacts_awaiting_answer": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "For each connection request whose branches all ended and one of which the change gives a step, by step id: how many contacts who finished once it was sent go back to waiting for its answer, judged as above.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Finished Contacts Awaiting Answer",
            "type": "object"
          },
          "finished_contacts_continuing": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "For each step a contact who had finished goes on to, by step id: how many finished at an end the change connects to that step, and go on to it once the change applies. Those who since replied, opted out, bounced, went on the do-not-contact list, answered or joined another sequence, were reached by one, left the audience, or lost their mailbox stay finished. Empty when the change connects no end anyone finished at.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Finished Contacts Continuing",
            "type": "object"
          },
          "mailbox_stopped_contacts": {
            "description": "Live contacts the change stops at their next email because it removes the sender whose mailbox emails them: a contact is only ever emailed from one mailbox. LinkedIn steps before that email still run.",
            "title": "Mailbox Stopped Contacts",
            "type": "integer"
          },
          "processing_contacts": {
            "title": "Processing Contacts",
            "type": "integer"
          },
          "removed_outcomes": {
            "description": "Each outcome the change takes off a Browser use step that stays: how many contacts took it (their history keeps it) and how many still on the step have the agent choose among the other outcomes, with the review's sentences.",
            "items": {
              "$ref": "#/components/schemas/RemovedOutcomeReviewSchema"
            },
            "title": "Removed Outcomes",
            "type": "array"
          },
          "removed_step_contacts": {
            "title": "Removed Step Contacts",
            "type": "integer"
          },
          "removed_step_going_on": {
            "default": 0,
            "description": "Live contacts on the steps the change removes who go on to what now follows them, as a new contact would, or finish there when nothing does; the rest of those on removed steps stop (removed_step_contacts).",
            "title": "Removed Step Going On",
            "type": "integer"
          },
          "removed_steps": {
            "description": "Each removed step anybody stands on, by name, with what happens to them: the review says it per step. `removed_step_contacts` and `removed_step_going_on` are the same counts summed.",
            "items": {
              "$ref": "#/components/schemas/RemovedStepReviewSchema"
            },
            "title": "Removed Steps",
            "type": "array"
          },
          "review_token": {
            "title": "Review Token",
            "type": "string"
          },
          "rewritten_messages": {
            "default": 0,
            "description": "Messages the agent already wrote and nobody has sent, edited or approved that the change has it write again: their step's prompt, subject or thread changed, or how the agent writes did. A person's own edit and words a person approved are kept.",
            "title": "Rewritten Messages",
            "type": "integer"
          },
          "shortened_window_contacts": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "For each connection request whose answer window the change shortens, by step id: how many contacts waiting for its answer have already waited longer than the new window, so their wait ends as soon as the change applies. Empty when no window shortens.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Shortened Window Contacts",
            "type": "object"
          },
          "waiting_contacts": {
            "title": "Waiting Contacts",
            "type": "integer"
          }
        },
        "required": [
          "changes",
          "active_contacts",
          "processing_contacts",
          "waiting_contacts",
          "removed_step_contacts",
          "mailbox_stopped_contacts",
          "review_token"
        ],
        "title": "SequenceChangesPreviewSchema",
        "type": "object"
      },
      "SequenceChangesSchema": {
        "description": "A person's waiting changes to a live sequence, as Review changes holds them.",
        "properties": {
          "agent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OutboundAgentUpdateSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "audience": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AudiencePutSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "copy_from_sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Copy From Sequence Id"
          },
          "expected_agent_version": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expected Agent Version"
          },
          "expected_updated_at": {
            "format": "date-time",
            "title": "Expected Updated At",
            "type": "string"
          },
          "graph": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceGraphPutSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "mapping": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnMappingSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "restore_version": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Restore Version"
          },
          "review_token": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Review Token"
          },
          "sender_profile_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 100,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sender Profile Ids"
          },
          "settings": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceUpdateSchema"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "expected_updated_at"
        ],
        "title": "SequenceChangesSchema",
        "type": "object"
      },
      "SequenceChangesStepPreviewReadSchema": {
        "description": "What a step's Preview shows of the waiting changes for one contact.",
        "properties": {
          "changed": {
            "description": "Whether the waiting changes change this step's words for this contact. False: the step reads as it does live (the changes touch something else, or the contact keeps the words they have: a person's own, or words a person approved or a send holds), and nothing was written.",
            "title": "Changed",
            "type": "boolean"
          },
          "message": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RenderedMessageReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step as the contact would get it once the changes are live. A step the agent writes is written again from the changes, spending one of the day's free previews per step written, and is saved nowhere: it names no `message_id`. The words written are kept for 30 minutes for this contact and these changes, so another step's Preview and a test send read them and spend nothing."
          },
          "reaches": {
            "default": true,
            "description": "Whether the changes reach this contact: false once this step has gone to them, when they are past it or down another branch, when they are done with the sequence and the changes do not carry them on, or when they are not in it.",
            "title": "Reaches",
            "type": "boolean"
          },
          "sent_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this step went to the contact, when it has.",
            "title": "Sent At"
          },
          "suggested_record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A contact of `candidate_record_ids` the changes do reach, offered in place of `record_id`, which they do not; `message` is then empty.",
            "title": "Suggested Record Id"
          }
        },
        "required": [
          "changed"
        ],
        "title": "SequenceChangesStepPreviewReadSchema",
        "type": "object"
      },
      "SequenceChangesStepPreviewSchema": {
        "description": "One step for one contact, as a person's waiting changes would have it.",
        "properties": {
          "candidate_record_ids": {
            "description": "Contacts the Preview may show instead, in the order it lists them. When the changes do not reach `record_id` and one of these they do reach, that one is offered as `suggested_record_id` and nothing is written.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 50,
            "title": "Candidate Record Ids",
            "type": "array"
          },
          "changes": {
            "$ref": "#/components/schemas/SequenceChangesSchema"
          },
          "record_id": {
            "description": "The contact the step is shown for.",
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "write": {
            "default": true,
            "description": "False answers whether the changes change this step and reach the contact, and writes nothing for a step the agent writes: no preview is spent. A typed step is filled in either way, which costs nothing.",
            "title": "Write",
            "type": "boolean"
          }
        },
        "required": [
          "changes",
          "record_id"
        ],
        "title": "SequenceChangesStepPreviewSchema",
        "type": "object"
      },
      "SequenceCheckReadSchema": {
        "description": "The launch check's verdict: whether the sequence could launch, and what stops or warns.",
        "properties": {
          "issues": {
            "description": "Every finding, addressed to the tab that fixes it. Empty when all is well.",
            "items": {
              "$ref": "#/components/schemas/PreflightIssueReadSchema"
            },
            "title": "Issues",
            "type": "array"
          },
          "ok": {
            "description": "True when no finding blocks the launch. Findings that do not block may remain.",
            "title": "Ok",
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "issues"
        ],
        "title": "SequenceCheckReadSchema",
        "type": "object"
      },
      "SequenceColumnContent": {
        "description": "Which of a sequence's mirrors a SEQUENCE column holds.\n\n``STATUS`` is one short sentence about where the contact stands.\n``MESSAGES`` is a list with one object per email or LinkedIn message the\nsequence sent them, which formulas, AI columns and exports may read.\n``BROWSER_OUTPUT`` is one value a Browser use step brought back for the\ncontact (\"Username\"), named by the definition's ``step_id`` and\n``output_key``. ``BROWSER_OUTCOME`` is the outcome a Browser use step's\nrun for the contact settled on, in its label (\"Signed up\", \"Needs\nhuman\"), named by the definition's ``step_id``.\n``LINKEDIN_PROFILE`` is the LinkedIn profile the sequence's profile views\nread for the contact, in the shape a \"Read a LinkedIn profile\" enrichment\nanswers with.",
        "enum": [
          "status",
          "messages",
          "browser_output",
          "browser_outcome",
          "linkedin_profile"
        ],
        "title": "SequenceColumnContent",
        "type": "string"
      },
      "SequenceColumnDefinition-Input": {
        "description": "Definition of a sequence column: one contact's live cadence state, or what it sent them.\n\nThe referenced sequence is denormalized by id only; rendering needs nothing\nbeyond the cell's own value, and the outreach stratum owns the write path\n(see ``TableColumnKind.SEQUENCE``).\n\nA LinkedIn profile column also carries a payload shape: the enrichment\nwhose answer it holds (``shape_action_key``) and that answer's declared\nfields (``output``), copied from the action when the column was made. With\nboth set, the column fans out, folds and promotes exactly like an\nenrichment column of that action, but it never runs: the sequence writes\nit. An older pod reads such a column as a step-less Browser use output\n(``_read_unknown_content``) and ignores both fields.",
        "properties": {
          "choices": {
            "description": "A select value's options; empty otherwise.",
            "items": {
              "type": "string"
            },
            "title": "Choices",
            "type": "array"
          },
          "content": {
            "$ref": "#/components/schemas/SequenceColumnContent",
            "default": "status",
            "description": "Whether the column holds the contact's status, the messages sent to them, a value a Browser use step brought back, the outcome its run settled on, or the LinkedIn profile its profile views read."
          },
          "field_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnType"
              },
              {
                "type": "null"
              }
            ],
            "description": "The type the step brings the value back as."
          },
          "hidden": {
            "default": false,
            "description": "Whether the value is kept out of sight: its cells show a mask.",
            "title": "Hidden",
            "type": "boolean"
          },
          "kind": {
            "const": "sequence",
            "default": "sequence",
            "title": "Kind",
            "type": "string"
          },
          "output": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentOutputFields-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The answer's declared fields, copied from that enrichment when the column was made."
          },
          "output_key": {
            "anyOf": [
              {
                "maxLength": 16,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step's own key for the value, which outlives a rename.",
            "title": "Output Key"
          },
          "sequence_id": {
            "description": "The sequence whose enrolment status this column mirrors.",
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          },
          "shape_action_key": {
            "anyOf": [
              {
                "maxLength": 100,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The enrichment whose answer shape this column holds.",
            "title": "Shape Action Key"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The Browser use step whose value, or outcome, this column holds.",
            "title": "Step Id"
          }
        },
        "required": [
          "sequence_id"
        ],
        "title": "SequenceColumnDefinition",
        "type": "object"
      },
      "SequenceColumnDefinition-Output": {
        "description": "Definition of a sequence column: one contact's live cadence state, or what it sent them.\n\nThe referenced sequence is denormalized by id only; rendering needs nothing\nbeyond the cell's own value, and the outreach stratum owns the write path\n(see ``TableColumnKind.SEQUENCE``).\n\nA LinkedIn profile column also carries a payload shape: the enrichment\nwhose answer it holds (``shape_action_key``) and that answer's declared\nfields (``output``), copied from the action when the column was made. With\nboth set, the column fans out, folds and promotes exactly like an\nenrichment column of that action, but it never runs: the sequence writes\nit. An older pod reads such a column as a step-less Browser use output\n(``_read_unknown_content``) and ignores both fields.",
        "properties": {
          "choices": {
            "description": "A select value's options; empty otherwise.",
            "items": {
              "type": "string"
            },
            "title": "Choices",
            "type": "array"
          },
          "content": {
            "$ref": "#/components/schemas/SequenceColumnContent",
            "default": "status",
            "description": "Whether the column holds the contact's status, the messages sent to them, a value a Browser use step brought back, the outcome its run settled on, or the LinkedIn profile its profile views read."
          },
          "field_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnType"
              },
              {
                "type": "null"
              }
            ],
            "description": "The type the step brings the value back as."
          },
          "hidden": {
            "default": false,
            "description": "Whether the value is kept out of sight: its cells show a mask.",
            "title": "Hidden",
            "type": "boolean"
          },
          "kind": {
            "const": "sequence",
            "default": "sequence",
            "title": "Kind",
            "type": "string"
          },
          "output": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentOutputFields-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "The answer's declared fields, copied from that enrichment when the column was made."
          },
          "output_key": {
            "anyOf": [
              {
                "maxLength": 16,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step's own key for the value, which outlives a rename.",
            "title": "Output Key"
          },
          "sequence_id": {
            "description": "The sequence whose enrolment status this column mirrors.",
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          },
          "shape_action_key": {
            "anyOf": [
              {
                "maxLength": 100,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The enrichment whose answer shape this column holds.",
            "title": "Shape Action Key"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The Browser use step whose value, or outcome, this column holds.",
            "title": "Step Id"
          }
        },
        "required": [
          "sequence_id"
        ],
        "title": "SequenceColumnDefinition",
        "type": "object"
      },
      "SequenceConditionKind": {
        "description": "The branching conditions.\n\n``BOUNCED`` and ``REPLIED`` are only pickable after a message step exists\nearlier on the same path: enforced at save, explained in the picker.",
        "enum": [
          "has_email",
          "has_linkedin_url",
          "linkedin_connected",
          "bounced",
          "replied",
          "linkedin_invite_accepted",
          "linkedin_open_profile"
        ],
        "title": "SequenceConditionKind",
        "type": "string"
      },
      "SequenceContactBulkUpdateResponseSchema": {
        "description": "What one bulk action on contacts did.",
        "properties": {
          "in_other_sequence": {
            "default": 0,
            "description": "Of the skipped, the contacts another live sequence has taken since: failed contacts a retry left failed, on the step that broke, for a retry once that sequence is done with them; and stopped contacts a resume marked skipped instead of putting back on the cadence.",
            "title": "In Other Sequence",
            "type": "integer"
          },
          "missing_values": {
            "description": "The values still_missing counts contacts for, in the order first met.",
            "items": {
              "type": "string"
            },
            "title": "Missing Values",
            "type": "array"
          },
          "still_missing": {
            "default": 0,
            "description": "Of the skipped, the failed contacts a retry left failed because a value their Browser use step's goal reads is still empty on their row; fill it in, then retry them.",
            "title": "Still Missing",
            "type": "integer"
          },
          "updated": {
            "description": "How many contacts actually took the action. A selection is rarely uniform, so rows the action cannot apply to are skipped, not failed.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated"
        ],
        "title": "SequenceContactBulkUpdateResponseSchema",
        "type": "object"
      },
      "SequenceCountSchema": {
        "description": "How many sequences match, and when the list's rollup metrics were last computed.",
        "properties": {
          "count": {
            "description": "How many sequences match the filters.",
            "title": "Count",
            "type": "integer"
          },
          "stats_refreshed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the list's stats were computed. Stats of any age are served at once. None only when they have never been built and could not be built on this request (for example, another request was building them).",
            "title": "Stats Refreshed At"
          },
          "stats_refreshing": {
            "description": "True when the stats were more than five minutes old and a refresh is running in the background. Read the list and this count again a few seconds later for newer numbers and a newer stats_refreshed_at.",
            "title": "Stats Refreshing",
            "type": "boolean"
          }
        },
        "required": [
          "count",
          "stats_refreshed_at",
          "stats_refreshing"
        ],
        "title": "SequenceCountSchema",
        "type": "object"
      },
      "SequenceCreateSchema": {
        "properties": {
          "campaign_key": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only with the ai starter: the library campaign to lay the steps out from, by key (see the outbound presets' campaigns). `problem_first` is three emails, `multichannel` adds a LinkedIn connection request with a branch on the answer. Omitted, the sequence starts as three emails.",
            "title": "Campaign Key"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder on the Sequences list to file it in; null for the top level.",
            "title": "Folder Id"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Defaults to 'New sequence'.",
            "title": "Name"
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Record Ids"
          },
          "sender_profile_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 100,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The senders to send from. Omitted leaves the sequence with none.",
            "title": "Sender Profile Ids"
          },
          "starter": {
            "default": "ai",
            "description": "What the draft opens on: `ai`, three emails the agent writes (or the library campaign `campaign_key` names); `written`, one email typed by hand; `blank`, no steps; `template`, a saved template (`template_id`); `browser_use`, one Browser use step with no goal yet, ending on Done or Needs human.",
            "enum": [
              "ai",
              "written",
              "blank",
              "template",
              "browser_use"
            ],
            "title": "Starter",
            "type": "string"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Table Id"
          },
          "template_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Template Id"
          },
          "timezone": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The creating browser's IANA timezone; seeds the default deliverability sending window. UTC when absent, or when it is not a timezone the send engine knows.",
            "title": "Timezone"
          },
          "view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "View Id"
          }
        },
        "title": "SequenceCreateSchema",
        "type": "object"
      },
      "SequenceCreatedContextSchema": {
        "description": "Context for a sequence's creation.",
        "properties": {
          "duplicated_from_name": {
            "default": "",
            "title": "Duplicated From Name",
            "type": "string"
          },
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "source": {
            "default": "new",
            "enum": [
              "new",
              "duplicate"
            ],
            "title": "Source",
            "type": "string"
          },
          "type": {
            "const": "created",
            "default": "created",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequenceCreatedContextSchema",
        "type": "object"
      },
      "SequenceDeletedContextSchema": {
        "description": "Context for a deletion.",
        "properties": {
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "type": {
            "const": "deleted",
            "default": "deleted",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequenceDeletedContextSchema",
        "type": "object"
      },
      "SequenceEdgeBranch": {
        "description": "Which way an edge leaves its step.\n\nDEFAULT for message-step flow; YES/NO for a condition's two branches. A\nconnection request leaves by the answer it got: CONNECTED (accepted, and\nalready connected unless that has a branch of its own), ALREADY_CONNECTED\n(present only when the request splits it out) and NOT_ACCEPTED.\n\nA Browser use step leaves by the outcome its run reached: OUTCOME_1 to\nOUTCOME_8 are fixed slots whose words the step's ``browser_config`` holds\n(a slot is never given to a second outcome once its first is removed), and\nNEEDS_HUMAN is the way every run may end, when the site wanted something\nonly a person can give. Fixed slots rather than free keys, so a branch\nstill fits the stored columns, the edge's unique constraint and every\nreader of this enum.",
        "enum": [
          "default",
          "yes",
          "no",
          "connected",
          "already_connected",
          "not_accepted",
          "outcome_1",
          "outcome_2",
          "outcome_3",
          "outcome_4",
          "outcome_5",
          "outcome_6",
          "outcome_7",
          "outcome_8",
          "needs_human"
        ],
        "title": "SequenceEdgeBranch",
        "type": "string"
      },
      "SequenceEdgeSchema": {
        "properties": {
          "branch": {
            "$ref": "#/components/schemas/SequenceEdgeBranch",
            "default": "default",
            "description": "Which way the connection leaves its step. `default` is the one way on from an email or a LinkedIn step; a condition leaves by `yes` and `no`. A connection request leaves by the answer it gets: `connected` (accepted, or connected already) and `not_accepted` (not accepted within its window), plus `already_connected` when already-connected contacts get a branch of their own; any of them may go to the same step. A connection request saved with one `default` connection, or none, gets both branches going where it went. A Browser use step leaves by one `outcome_1` to `outcome_8` per outcome its setup names, plus `needs_human`; one saved with a single `default` connection, or none, sends every outcome where it went and `needs_human` to the end."
          },
          "from_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "None = the start node.",
            "title": "From Step Id"
          },
          "to_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "None = an end node.",
            "title": "To Step Id"
          }
        },
        "title": "SequenceEdgeSchema",
        "type": "object"
      },
      "SequenceEditedContextSchema": {
        "description": "Context for an edit to one surface of a sequence.",
        "properties": {
          "changes": {
            "items": {
              "$ref": "#/components/schemas/SequenceFieldChangeSchema"
            },
            "title": "Changes",
            "type": "array"
          },
          "fields": {
            "items": {
              "type": "string"
            },
            "title": "Fields",
            "type": "array"
          },
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "surface": {
            "default": "",
            "title": "Surface",
            "type": "string"
          },
          "type": {
            "const": "edited",
            "default": "edited",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequenceEditedContextSchema",
        "type": "object"
      },
      "SequenceFieldChangeSchema": {
        "properties": {
          "after": {
            "title": "After"
          },
          "before": {
            "title": "Before"
          },
          "field": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Field"
          },
          "label": {
            "title": "Label",
            "type": "string"
          }
        },
        "required": [
          "label"
        ],
        "title": "SequenceFieldChangeSchema",
        "type": "object"
      },
      "SequenceFolderCreateSchema": {
        "description": "Request body for making a sequence folder.",
        "properties": {
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder's name. Leave it out for \"Untitled folder\", numbered when the place already has one.",
            "title": "Name"
          },
          "parent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder to make it in; null for the top level.",
            "title": "Parent Id"
          }
        },
        "title": "SequenceFolderCreateSchema",
        "type": "object"
      },
      "SequenceFolderCrumbSchema": {
        "description": "One folder on the way to a sequence, from the top level down.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "SequenceFolderCrumbSchema",
        "type": "object"
      },
      "SequenceFolderDeletedResponseSchema": {
        "description": "What deleting a sequence folder, to Trash or for good, took with it.",
        "properties": {
          "count": {
            "default": 1,
            "description": "The folders that went: this one and every folder in it.",
            "title": "Count",
            "type": "integer"
          },
          "detail": {
            "description": "The detail of why the resource was deleted.",
            "title": "Detail",
            "type": "string"
          },
          "left_in_trash_sequence_ids": {
            "description": "For good only: sequences that could not be deleted this time. They keep the folder in Trash, listing them; try again.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Left In Trash Sequence Ids",
            "type": "array"
          },
          "paused_count": {
            "default": 0,
            "description": "To Trash only: how many of them were running and pause, letting their contacts go, as a sequence moved to Trash on its own does.",
            "title": "Paused Count",
            "type": "integer"
          },
          "sequence_ids": {
            "description": "The sequences that went with it: to Trash, where they come back with the folder, or for good.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Sequence Ids",
            "type": "array"
          }
        },
        "required": [
          "detail"
        ],
        "title": "SequenceFolderDeletedResponseSchema",
        "type": "object"
      },
      "SequenceFolderRestoreReadSchema": {
        "description": "What restoring a sequence folder brought back.",
        "properties": {
          "contacts_held_elsewhere": {
            "description": "Their contacts another sequence took while they were in Trash, which stay stopped. The rest are taken back where they stood, in the background.",
            "title": "Contacts Held Elsewhere",
            "type": "integer"
          },
          "folder": {
            "$ref": "#/components/schemas/SequenceFolderSchema"
          },
          "folder_count": {
            "description": "Folders that came back, this one included.",
            "title": "Folder Count",
            "type": "integer"
          },
          "left_in_trash_sequence_ids": {
            "description": "Sequences that stayed in Trash because a live sequence has taken their name since. Each is now listed in Trash on its own.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Left In Trash Sequence Ids",
            "type": "array"
          },
          "sequence_ids": {
            "description": "Sequences that came back with it, paused.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Sequence Ids",
            "type": "array"
          }
        },
        "required": [
          "folder",
          "folder_count",
          "sequence_ids",
          "left_in_trash_sequence_ids",
          "contacts_held_elsewhere"
        ],
        "title": "SequenceFolderRestoreReadSchema",
        "type": "object"
      },
      "SequenceFolderSchema": {
        "description": "A folder on the Sequences list.",
        "properties": {
          "audience_sequence_count": {
            "default": 0,
            "description": "In Trash only: how many of the sequences that went with it write to an audience table, whose status and messages columns Delete forever takes; 0 for a live folder.",
            "title": "Audience Sequence Count",
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "deleted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it was moved to Trash; null for a live folder. In Trash, sequence_count and folder_count are the sequences and folders that went with it, at any depth, and come back with it.",
            "title": "Deleted At"
          },
          "folder_count": {
            "default": 0,
            "description": "Folders directly in it.",
            "title": "Folder Count",
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "nested_sequence_count": {
            "default": 0,
            "description": "Sequences in it at any depth: what deleting it would send to Trash.",
            "title": "Nested Sequence Count",
            "type": "integer"
          },
          "parent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder it sits in; null for the top level.",
            "title": "Parent Id"
          },
          "sequence_count": {
            "default": 0,
            "description": "Sequences directly in it.",
            "title": "Sequence Count",
            "type": "integer"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "parent_id",
          "created_at",
          "updated_at"
        ],
        "title": "SequenceFolderSchema",
        "type": "object"
      },
      "SequenceFolderSuggestionReason": {
        "description": "Why some loose sequences look like they belong in one folder, strongest sign first.\n\n``audience_table``: they write to the same audience table. ``campaign_code``:\ntheir names end in the same code, as in \"(EF-1)\". ``shared_name``: their names\nstart the same up to a dash. The last two values match the Tables list's.",
        "enum": [
          "audience_table",
          "campaign_code",
          "shared_name"
        ],
        "title": "SequenceFolderSuggestionReason",
        "type": "string"
      },
      "SequenceFolderSuggestionSchema": {
        "description": "A folder a few sequences in no folder look like they belong in.",
        "properties": {
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A folder of that name already at the top level, to file them in; null when accepting makes it.",
            "title": "Folder Id"
          },
          "name": {
            "description": "The folder's name: the one to make, or the one there.",
            "title": "Name",
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/SequenceFolderSuggestionReason",
            "description": "audience_table: they write to the same audience table, which names the folder. campaign_code: their names end in the same code, as in (EF-1). shared_name: their names start the same, up to a dash."
          },
          "sequences": {
            "description": "The sequences it would file, two or more, by name.",
            "items": {
              "$ref": "#/components/schemas/SequenceFolderSuggestionSequenceSchema"
            },
            "title": "Sequences",
            "type": "array"
          }
        },
        "required": [
          "name",
          "folder_id",
          "reason",
          "sequences"
        ],
        "title": "SequenceFolderSuggestionSchema",
        "type": "object"
      },
      "SequenceFolderSuggestionSequenceSchema": {
        "description": "A sequence a folder suggestion would file.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "SequenceFolderSuggestionSequenceSchema",
        "type": "object"
      },
      "SequenceFolderSuggestionsSchema": {
        "description": "The folders the sequences in no folder suggest.",
        "properties": {
          "data": {
            "description": "Biggest first, then by name. Each sequence is in one suggestion at most.",
            "items": {
              "$ref": "#/components/schemas/SequenceFolderSuggestionSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "loose_sequence_count": {
            "description": "Sequences on the list in no folder.",
            "title": "Loose Sequence Count",
            "type": "integer"
          }
        },
        "required": [
          "data",
          "loose_sequence_count"
        ],
        "title": "SequenceFolderSuggestionsSchema",
        "type": "object"
      },
      "SequenceFolderUpdateSchema": {
        "description": "Request body for renaming or moving a sequence folder (omitted fields stay).",
        "properties": {
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "description": "Its new name.",
            "title": "Name"
          },
          "parent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The folder to move it into; null for the top level.",
            "title": "Parent Id"
          }
        },
        "title": "SequenceFolderUpdateSchema",
        "type": "object"
      },
      "SequenceFunnelReadSchema": {
        "description": "Live per-node counts overlaid on the builder.",
        "properties": {
          "branches": {
            "items": {
              "$ref": "#/components/schemas/BranchSplitReadSchema"
            },
            "title": "Branches",
            "type": "array"
          },
          "nodes": {
            "items": {
              "$ref": "#/components/schemas/NodeFunnelReadSchema"
            },
            "title": "Nodes",
            "type": "array"
          },
          "orphaned_executed": {
            "title": "Orphaned Executed",
            "type": "integer"
          }
        },
        "required": [
          "nodes",
          "branches",
          "orphaned_executed"
        ],
        "title": "SequenceFunnelReadSchema",
        "type": "object"
      },
      "SequenceGraphPutSchema": {
        "properties": {
          "edges": {
            "items": {
              "$ref": "#/components/schemas/SequenceEdgeSchema"
            },
            "maxItems": 1000,
            "title": "Edges",
            "type": "array"
          },
          "expected_updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Autosave concurrency token; a mismatch means another tab saved first (409).",
            "title": "Expected Updated At"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/SequenceStepSchema-Input"
            },
            "maxItems": 200,
            "title": "Steps",
            "type": "array"
          }
        },
        "title": "SequenceGraphPutSchema",
        "type": "object"
      },
      "SequenceHold": {
        "description": "One reason a live contact cannot move right now, as the sequence's pages say it.\n\nThe stored ``HoldReason`` and the task-derived ``WaitingOn`` each cover part\nof this; the LinkedIn account's own state covers the rest. This is their\nunion, read at request time, so the Overview, the Audience tab, the header\nand the Sequences list name one reason with one word (the silent-stall\nplan, approved 2026-09-30).\n\nListed worst first: the order is the order a page picks its one headline\nor banner by. The first five need a person; ``EMAIL_CHECK`` may (it ends\nby itself while the deliverability column runs); ``APPROVAL`` needs one\nbut has its own row and banner already; the rest end on their own,\n``BROWSER_UNAVAILABLE`` first among them.",
        "enum": [
          "linkedin_verify_account",
          "linkedin_disconnected",
          "no_mailbox",
          "no_message",
          "linkedin_browser_offline",
          "email_check",
          "approval",
          "browser_unavailable",
          "daily_cap",
          "linkedin_daily_limit",
          "linkedin_weekly_limit",
          "window",
          "writing_delayed",
          "queued_to_write",
          "queued_for_approval"
        ],
        "title": "SequenceHold",
        "type": "string"
      },
      "SequenceHoldReadSchema": {
        "description": "How many live contacts one reason holds, and what a page needs to say it.",
        "properties": {
          "action_kind": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a LinkedIn limit: the kind of step it stopped.",
            "title": "Action Kind"
          },
          "contacts": {
            "title": "Contacts",
            "type": "integer"
          },
          "last_seen_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For an offline browser: its last check-in.",
            "title": "Last Seen At"
          },
          "limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a LinkedIn limit: the limit.",
            "title": "Limit"
          },
          "long_offline": {
            "default": false,
            "description": "For an offline browser: nothing for over a day.",
            "title": "Long Offline",
            "type": "boolean"
          },
          "reason": {
            "$ref": "#/components/schemas/SequenceHold",
            "description": "What holds them, worst first in the list: a LinkedIn account asking to be verified or disconnected, no mailbox, a step with no message, an offline LinkedIn browser, approval, the email or LinkedIn daily limit, the weekly connection request limit, the sending window, or the AI writer."
          },
          "sender_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "That sender's first name, else their name.",
            "title": "Sender Name"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a LinkedIn reason: the sender whose account it is.",
            "title": "Sender Profile Id"
          },
          "until": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the reason ends on its own: the window's next opening, a daily limit's reset, the AI writer's next try. Null where only a person ends it.",
            "title": "Until"
          },
          "used": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a LinkedIn limit: how many used.",
            "title": "Used"
          }
        },
        "required": [
          "reason",
          "contacts"
        ],
        "title": "SequenceHoldReadSchema",
        "type": "object"
      },
      "SequenceHoldsReadSchema": {
        "description": "Whether anybody on a sequence can move right now, and if not, why.",
        "properties": {
          "browsing": {
            "default": 0,
            "description": "Of moving, the contacts on a Browser use step whose run waits in line or runs. They send nothing: when every contact moving is browsing, the only work left is browser runs.",
            "title": "Browsing",
            "type": "integer"
          },
          "holds": {
            "items": {
              "$ref": "#/components/schemas/SequenceHoldReadSchema"
            },
            "title": "Holds",
            "type": "array"
          },
          "moving": {
            "description": "Live contacts nothing holds: due now, sending, in line on a working browser, or waiting out an ordinary step delay. Zero with holds listed means nobody can move.",
            "title": "Moving",
            "type": "integer"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/StepHoldReadSchema"
            },
            "title": "Steps",
            "type": "array"
          },
          "window_opens_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sending window's next opening while it is shut; null while open.",
            "title": "Window Opens At"
          }
        },
        "required": [
          "moving",
          "window_opens_at",
          "holds",
          "steps"
        ],
        "title": "SequenceHoldsReadSchema",
        "type": "object"
      },
      "SequenceLaunchReadSchema": {
        "description": "The launched sequence, with who it starts on now and when the rest start.",
        "properties": {
          "audience_table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audience Table Id"
          },
          "audience_table_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only: the name of audience_table_id's table, which a sequence in Trash keeps its status and messages columns on. Null when it has none, or the table is in Trash too.",
            "title": "Audience Table Name"
          },
          "audience_view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audience View Id"
          },
          "bcc_addresses": {
            "description": "Blind copies on every email this sequence sends.",
            "items": {
              "type": "string"
            },
            "title": "Bcc Addresses",
            "type": "array"
          },
          "browser_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Credits the sequence's Browser use runs were charged, all told (rollup, list reads only).",
            "title": "Browser Credits"
          },
          "browser_needs_human": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Of browser_runs, those that ended on Needs human (rollup, list reads only).",
            "title": "Browser Needs Human"
          },
          "browser_only": {
            "default": false,
            "description": "Whether every step that acts is a Browser use step (conditions aside), so the sequence sends nothing and has no reply rate: the list shows its browser_runs and browser_credits instead. Read live, never from the cached stats.",
            "title": "Browser Only",
            "type": "boolean"
          },
          "browser_runs": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Browser use runs that ended on an outcome, Needs human included (rollup, list reads only). None while the stats have not been built in this shape.",
            "title": "Browser Runs"
          },
          "cc_addresses": {
            "description": "Addresses copied on every email this sequence sends.",
            "items": {
              "type": "string"
            },
            "title": "Cc Addresses",
            "type": "array"
          },
          "column_mapping": {
            "$ref": "#/components/schemas/ColumnMappingSchema"
          },
          "connection_requests_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Connection Requests Sent"
          },
          "connections_accepted": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Connection requests from this sequence confirmed accepted. With connection_requests_sent this yields the acceptance rate.",
            "title": "Connections Accepted"
          },
          "contacts_added": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts still in the audience, as the Audience tab's All counts them. Since 2026-11-07 it leaves out the Removed tab's contacts (removed by hand, or their row deleted or out of the view). None when the list's stats have never been built and could not be built on this request (for example, another request was building them). Show a zero state, not a fake 0.",
            "title": "Contacts Added"
          },
          "contacts_blocked": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's Blocked tab (failed, bounced, in cooldown, mailbox removed, do not contact, in another sequence). Unreachable contacts count under In progress here; the Audience tab counts them under Blocked, because reachability is judged from the row as it reads now.",
            "title": "Contacts Blocked"
          },
          "contacts_done": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's Done tab (finished, replied, unsubscribed, stopped and the like). Removed contacts are counted nowhere here since 2026-11-07.",
            "title": "Contacts Done"
          },
          "contacts_failed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: every contact whose step failed (rollup, list reads only). Read contacts_blocked, which counts them with everyone else the Audience tab files under Blocked.",
            "title": "Contacts Failed"
          },
          "contacts_finished": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: every contact who completed the cadence or stopped for any reason (rollup, list reads only). Read contacts_done and contacts_blocked, which split them as the Audience tab does.",
            "title": "Contacts Finished"
          },
          "contacts_in_progress": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's In progress, Needs approval and Paused tabs together. On a draft these are its contacts who start when it launches, which the list calls Not started. Unreachable contacts count under In progress here; the Audience tab counts them under Blocked, because reachability is judged from the row as it reads now. Since 2026-10-19 it also counts Needs approval and Paused contacts and a draft's waiting contacts; it counted only contacts moving before. None when the stats have not been built in this shape yet.",
            "title": "Contacts In Progress"
          },
          "contacts_not_started": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: a draft's contacts, who start when it launches (rollup, list reads only). Read contacts_in_progress, which on a draft counts the same contacts the list calls Not started.",
            "title": "Contacts Not Started"
          },
          "continuous_enrolment": {
            "default": false,
            "description": "TRUE keeps the audience live: rows added to the table later enrol on their own, and rows that leave it stop. FALSE (the default for a new sequence) freezes the audience after launch; rows can still be added to it by hand, through the add-to-sequence route.",
            "title": "Continuous Enrolment",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "deleted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it went to Trash; null for a live sequence. Trash deletes it for good 30 days after. A launched one went paused and comes back paused; a draft comes back a draft.",
            "title": "Deleted At"
          },
          "edges": {
            "items": {
              "$ref": "#/components/schemas/SequenceEdgeSchema"
            },
            "title": "Edges",
            "type": "array"
          },
          "email_approval_mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`manual` requires approval; `confident` adds approval for uncertain AI-written emails; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.",
            "title": "Email Approval Mode"
          },
          "emails_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Emails Sent"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder it is filed in on the Sequences list; null for the top level. A placement only: everyone in the workspace still opens every sequence. A folder that went to Trash leaves a live sequence still naming it at the top level.",
            "title": "Folder Id"
          },
          "folder_path": {
            "description": "The folders on the way to it, from the top level down, its own folder last; empty at the top level.",
            "items": {
              "$ref": "#/components/schemas/SequenceFolderCrumbSchema"
            },
            "title": "Folder Path",
            "type": "array"
          },
          "hold": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceListHoldSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only, read live on every request (never from the cached stats): on a running sequence nobody on which can move, the worst reason holding them (as GET /sequences/{id}/holds/ names it). Null while anybody moves and on any other status."
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_favorite": {
            "default": false,
            "description": "List reads only: whether the person asking starred the sequence. Their own, never a teammate's; always false for an API key.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "last_synced_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the audience-enrolment diff last completed. None until the first sync (launch runs one inline). The Audience tab shows this plus a manual trigger, never a background job the user cannot see.",
            "title": "Last Synced At"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only: when the person asking last opened the sequence; null when they never have, and for an API key.",
            "title": "Last Viewed At"
          },
          "launched_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Launched At"
          },
          "linkedin_approval_mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`manual` requires approval; `confident` adds approval for uncertain AI-written LinkedIn steps; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.",
            "title": "Linkedin Approval Mode"
          },
          "linkedin_check_max_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired. Acceptance checks now use the service-managed interval.",
            "title": "Linkedin Check Max Seconds"
          },
          "linkedin_check_min_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired. Acceptance checks now use the service-managed interval.",
            "title": "Linkedin Check Min Seconds"
          },
          "linkedin_messages_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Messages Sent"
          },
          "multithreading": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Multithreading"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "opportunity_values": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "integer"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Dollars per outcome label; None = tracking off.",
            "title": "Opportunity Values"
          },
          "opt_out_footer_text": {
            "title": "Opt Out Footer Text",
            "type": "string"
          },
          "out_of_office_days_after": {
            "default": 0,
            "description": "How many business days after the return day the next step goes, 0 (the day they are back) to 5.",
            "title": "Out Of Office Days After",
            "type": "integer"
          },
          "out_of_office_wait": {
            "default": true,
            "description": "TRUE (the default) waits for a contact whose out-of-office reply says when they are back: their next step goes on that day, or out_of_office_days_after business days later, in the sending hours. It moves only a step that would have gone sooner. A return more than 30 days away counts as 30 days, and a reply naming no day waits 7 days. FALSE ignores the reply and goes on as planned.",
            "title": "Out Of Office Wait",
            "type": "boolean"
          },
          "outbound_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sequence's outbound agent: the writer of every agent-written step and of its replies. Read and configure it under /outbound-agents/{id}/.",
            "title": "Outbound Agent Id"
          },
          "pause_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pause Reason"
          },
          "plain_text_only": {
            "default": true,
            "description": "TRUE (recommended) sends no formatting: the bold, italic and link marks are stripped and the email reads as plain text; FALSE renders them. Either way the email carries an HTML part laid out line for line, which keeps its spacing exactly, beside a matching text part.",
            "title": "Plain Text Only",
            "type": "boolean"
          },
          "positive": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Threads labelled positive (rollup, list reads only).",
            "title": "Positive"
          },
          "positive_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Positive Rate"
          },
          "replies": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Distinct contacts who replied: reply_rate's numerator.",
            "title": "Replies"
          },
          "reply_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "replies divided by the distinct people reached on any channel: sent an email, sent a LinkedIn message or InMail, or who accepted a connection request (rollup, list reads only).",
            "title": "Reply Rate"
          },
          "sender_profile_ids": {
            "description": "Only meaningful on list reads: the sequence's senders by id, in the same order as sender_profile_names.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Sender Profile Ids",
            "type": "array"
          },
          "sender_profile_names": {
            "description": "Only meaningful on list reads: the names of the sequence's senders.",
            "items": {
              "type": "string"
            },
            "title": "Sender Profile Names",
            "type": "array"
          },
          "senders_ready": {
            "default": true,
            "description": "Only meaningful on list reads: False when the sequence has senders but none currently has a connected mailbox.",
            "title": "Senders Ready",
            "type": "boolean"
          },
          "sending_priority": {
            "default": "new_contacts",
            "description": "Who gets scarce capacity first: new_contacts or follow_ups.",
            "title": "Sending Priority",
            "type": "string"
          },
          "sending_window": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sending Window"
          },
          "sending_window_problem": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingWindowProblemSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set when the saved sending_window breaks a rule a save now refuses, which only a window saved before those rules can. It still sends on it as stored: an unknown timezone is read as UTC, and no open day sends at any hour. Fix it by saving a valid sending_window."
          },
          "spending_limit_tenths": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spending Limit Tenths"
          },
          "starting_now": {
            "description": "Contacts due the moment the launch finished, which the engine starts at once. Poll /sequences/{id}/start-progress/ to follow them.",
            "title": "Starting Now",
            "type": "integer"
          },
          "starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the roster starts, when that is later than now because the sending window is closed; null when the window is open.",
            "title": "Starts At"
          },
          "status": {
            "$ref": "#/components/schemas/SequenceStatus"
          },
          "status_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status Column Id"
          },
          "step_count": {
            "title": "Step Count",
            "type": "integer"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/SequenceStepSchema-Output"
            },
            "title": "Steps",
            "type": "array"
          },
          "trashed_with_folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "In Trash only: the folder that took it there, which brings it back (POST /sequences/folders/{id}/restore/). Null when it went on its own.",
            "title": "Trashed With Folder Id"
          },
          "trashed_with_folder_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Single reads in Trash only: the name of trashed_with_folder_id's folder.",
            "title": "Trashed With Folder Name"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "audience_table_id",
          "audience_view_id",
          "column_mapping",
          "status_column_id",
          "sending_window",
          "multithreading",
          "opt_out_footer_text",
          "launched_at",
          "pause_reason",
          "created_at",
          "updated_at",
          "steps",
          "edges",
          "step_count",
          "starting_now",
          "starts_at"
        ],
        "title": "SequenceLaunchReadSchema",
        "type": "object"
      },
      "SequenceLaunchedContextSchema": {
        "description": "Context for a launch.",
        "properties": {
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "type": {
            "const": "launched",
            "default": "launched",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequenceLaunchedContextSchema",
        "type": "object"
      },
      "SequenceListHoldSchema": {
        "description": "The one reason a running sequence's list row names while nobody on it can move.",
        "properties": {
          "contacts": {
            "description": "How many contacts it holds: for approval, the cards waiting in Tasks, which the row names (\"Needs approval: 10\").",
            "title": "Contacts",
            "type": "integer"
          },
          "long_offline": {
            "default": false,
            "description": "For an offline browser: nothing for over a day.",
            "title": "Long Offline",
            "type": "boolean"
          },
          "reason": {
            "$ref": "#/components/schemas/SequenceHold"
          },
          "sender_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a LinkedIn reason: whose account it is.",
            "title": "Sender Name"
          },
          "until": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the reason ends on its own, where it does.",
            "title": "Until"
          },
          "window_open": {
            "default": true,
            "description": "Whether the sending window was open when this was read. An offline browser is only worth a warning while it is (call C3).",
            "title": "Window Open",
            "type": "boolean"
          }
        },
        "required": [
          "reason",
          "contacts"
        ],
        "title": "SequenceListHoldSchema",
        "type": "object"
      },
      "SequenceObservedCostsReadSchema": {
        "description": "What a sequence's contacts have cost so far: the samples its usual price is read from.\n\nA client prices each step as the header's \"Up to\" does, then swaps in what these say:\nthe share of contacts whose first message read the web and their LinkedIn profile, and\neach Browser use step's average charge. A step with no sample keeps its most.",
        "properties": {
          "browser_steps": {
            "description": "Each Browser use step with runs that opened a browser.",
            "items": {
              "$ref": "#/components/schemas/SequenceBrowserStepCostReadSchema"
            },
            "title": "Browser Steps",
            "type": "array"
          },
          "previewed_contacts": {
            "description": "Contacts with only a preview, written as a live send would be (its web and profile reads as a send makes them).",
            "title": "Previewed Contacts",
            "type": "integer"
          },
          "profile_read_contacts": {
            "description": "Of both, the contacts whose writing read their LinkedIn profile.",
            "title": "Profile Read Contacts",
            "type": "integer"
          },
          "researched_contacts": {
            "description": "Of both, the contacts whose writing read the web.",
            "title": "Researched Contacts",
            "type": "integer"
          },
          "written_contacts": {
            "description": "Contacts the sequence's agent was charged to write to, with its Effort and research switches as they stand now.",
            "title": "Written Contacts",
            "type": "integer"
          }
        },
        "required": [
          "written_contacts",
          "previewed_contacts",
          "researched_contacts",
          "profile_read_contacts",
          "browser_steps"
        ],
        "title": "SequenceObservedCostsReadSchema",
        "type": "object"
      },
      "SequencePauseReadSchema": {
        "description": "The paused sequence, with the cloud browsers the pause stops.",
        "properties": {
          "audience_table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audience Table Id"
          },
          "audience_table_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only: the name of audience_table_id's table, which a sequence in Trash keeps its status and messages columns on. Null when it has none, or the table is in Trash too.",
            "title": "Audience Table Name"
          },
          "audience_view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audience View Id"
          },
          "bcc_addresses": {
            "description": "Blind copies on every email this sequence sends.",
            "items": {
              "type": "string"
            },
            "title": "Bcc Addresses",
            "type": "array"
          },
          "browser_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Credits the sequence's Browser use runs were charged, all told (rollup, list reads only).",
            "title": "Browser Credits"
          },
          "browser_needs_human": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Of browser_runs, those that ended on Needs human (rollup, list reads only).",
            "title": "Browser Needs Human"
          },
          "browser_only": {
            "default": false,
            "description": "Whether every step that acts is a Browser use step (conditions aside), so the sequence sends nothing and has no reply rate: the list shows its browser_runs and browser_credits instead. Read live, never from the cached stats.",
            "title": "Browser Only",
            "type": "boolean"
          },
          "browser_runs": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Browser use runs that ended on an outcome, Needs human included (rollup, list reads only). None while the stats have not been built in this shape.",
            "title": "Browser Runs"
          },
          "browsers_stopping": {
            "description": "Browser use runs of this sequence whose cloud browser was open when it paused. Each stops within seconds, and the minutes it ran are charged; a run whose browser had not opened yet never opens one and costs nothing. On a dry run, how many would stop.",
            "title": "Browsers Stopping",
            "type": "integer"
          },
          "cc_addresses": {
            "description": "Addresses copied on every email this sequence sends.",
            "items": {
              "type": "string"
            },
            "title": "Cc Addresses",
            "type": "array"
          },
          "column_mapping": {
            "$ref": "#/components/schemas/ColumnMappingSchema"
          },
          "connection_requests_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Connection Requests Sent"
          },
          "connections_accepted": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Connection requests from this sequence confirmed accepted. With connection_requests_sent this yields the acceptance rate.",
            "title": "Connections Accepted"
          },
          "contacts_added": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts still in the audience, as the Audience tab's All counts them. Since 2026-11-07 it leaves out the Removed tab's contacts (removed by hand, or their row deleted or out of the view). None when the list's stats have never been built and could not be built on this request (for example, another request was building them). Show a zero state, not a fake 0.",
            "title": "Contacts Added"
          },
          "contacts_blocked": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's Blocked tab (failed, bounced, in cooldown, mailbox removed, do not contact, in another sequence). Unreachable contacts count under In progress here; the Audience tab counts them under Blocked, because reachability is judged from the row as it reads now.",
            "title": "Contacts Blocked"
          },
          "contacts_done": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's Done tab (finished, replied, unsubscribed, stopped and the like). Removed contacts are counted nowhere here since 2026-11-07.",
            "title": "Contacts Done"
          },
          "contacts_failed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: every contact whose step failed (rollup, list reads only). Read contacts_blocked, which counts them with everyone else the Audience tab files under Blocked.",
            "title": "Contacts Failed"
          },
          "contacts_finished": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: every contact who completed the cadence or stopped for any reason (rollup, list reads only). Read contacts_done and contacts_blocked, which split them as the Audience tab does.",
            "title": "Contacts Finished"
          },
          "contacts_in_progress": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's In progress, Needs approval and Paused tabs together. On a draft these are its contacts who start when it launches, which the list calls Not started. Unreachable contacts count under In progress here; the Audience tab counts them under Blocked, because reachability is judged from the row as it reads now. Since 2026-10-19 it also counts Needs approval and Paused contacts and a draft's waiting contacts; it counted only contacts moving before. None when the stats have not been built in this shape yet.",
            "title": "Contacts In Progress"
          },
          "contacts_not_started": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: a draft's contacts, who start when it launches (rollup, list reads only). Read contacts_in_progress, which on a draft counts the same contacts the list calls Not started.",
            "title": "Contacts Not Started"
          },
          "continuous_enrolment": {
            "default": false,
            "description": "TRUE keeps the audience live: rows added to the table later enrol on their own, and rows that leave it stop. FALSE (the default for a new sequence) freezes the audience after launch; rows can still be added to it by hand, through the add-to-sequence route.",
            "title": "Continuous Enrolment",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "deleted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it went to Trash; null for a live sequence. Trash deletes it for good 30 days after. A launched one went paused and comes back paused; a draft comes back a draft.",
            "title": "Deleted At"
          },
          "edges": {
            "items": {
              "$ref": "#/components/schemas/SequenceEdgeSchema"
            },
            "title": "Edges",
            "type": "array"
          },
          "email_approval_mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`manual` requires approval; `confident` adds approval for uncertain AI-written emails; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.",
            "title": "Email Approval Mode"
          },
          "emails_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Emails Sent"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder it is filed in on the Sequences list; null for the top level. A placement only: everyone in the workspace still opens every sequence. A folder that went to Trash leaves a live sequence still naming it at the top level.",
            "title": "Folder Id"
          },
          "folder_path": {
            "description": "The folders on the way to it, from the top level down, its own folder last; empty at the top level.",
            "items": {
              "$ref": "#/components/schemas/SequenceFolderCrumbSchema"
            },
            "title": "Folder Path",
            "type": "array"
          },
          "hold": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceListHoldSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only, read live on every request (never from the cached stats): on a running sequence nobody on which can move, the worst reason holding them (as GET /sequences/{id}/holds/ names it). Null while anybody moves and on any other status."
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_favorite": {
            "default": false,
            "description": "List reads only: whether the person asking starred the sequence. Their own, never a teammate's; always false for an API key.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "last_synced_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the audience-enrolment diff last completed. None until the first sync (launch runs one inline). The Audience tab shows this plus a manual trigger, never a background job the user cannot see.",
            "title": "Last Synced At"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only: when the person asking last opened the sequence; null when they never have, and for an API key.",
            "title": "Last Viewed At"
          },
          "launched_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Launched At"
          },
          "linkedin_approval_mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`manual` requires approval; `confident` adds approval for uncertain AI-written LinkedIn steps; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.",
            "title": "Linkedin Approval Mode"
          },
          "linkedin_check_max_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired. Acceptance checks now use the service-managed interval.",
            "title": "Linkedin Check Max Seconds"
          },
          "linkedin_check_min_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired. Acceptance checks now use the service-managed interval.",
            "title": "Linkedin Check Min Seconds"
          },
          "linkedin_messages_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Messages Sent"
          },
          "multithreading": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Multithreading"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "opportunity_values": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "integer"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Dollars per outcome label; None = tracking off.",
            "title": "Opportunity Values"
          },
          "opt_out_footer_text": {
            "title": "Opt Out Footer Text",
            "type": "string"
          },
          "out_of_office_days_after": {
            "default": 0,
            "description": "How many business days after the return day the next step goes, 0 (the day they are back) to 5.",
            "title": "Out Of Office Days After",
            "type": "integer"
          },
          "out_of_office_wait": {
            "default": true,
            "description": "TRUE (the default) waits for a contact whose out-of-office reply says when they are back: their next step goes on that day, or out_of_office_days_after business days later, in the sending hours. It moves only a step that would have gone sooner. A return more than 30 days away counts as 30 days, and a reply naming no day waits 7 days. FALSE ignores the reply and goes on as planned.",
            "title": "Out Of Office Wait",
            "type": "boolean"
          },
          "outbound_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sequence's outbound agent: the writer of every agent-written step and of its replies. Read and configure it under /outbound-agents/{id}/.",
            "title": "Outbound Agent Id"
          },
          "pause_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pause Reason"
          },
          "plain_text_only": {
            "default": true,
            "description": "TRUE (recommended) sends no formatting: the bold, italic and link marks are stripped and the email reads as plain text; FALSE renders them. Either way the email carries an HTML part laid out line for line, which keeps its spacing exactly, beside a matching text part.",
            "title": "Plain Text Only",
            "type": "boolean"
          },
          "positive": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Threads labelled positive (rollup, list reads only).",
            "title": "Positive"
          },
          "positive_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Positive Rate"
          },
          "replies": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Distinct contacts who replied: reply_rate's numerator.",
            "title": "Replies"
          },
          "reply_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "replies divided by the distinct people reached on any channel: sent an email, sent a LinkedIn message or InMail, or who accepted a connection request (rollup, list reads only).",
            "title": "Reply Rate"
          },
          "sender_profile_ids": {
            "description": "Only meaningful on list reads: the sequence's senders by id, in the same order as sender_profile_names.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Sender Profile Ids",
            "type": "array"
          },
          "sender_profile_names": {
            "description": "Only meaningful on list reads: the names of the sequence's senders.",
            "items": {
              "type": "string"
            },
            "title": "Sender Profile Names",
            "type": "array"
          },
          "senders_ready": {
            "default": true,
            "description": "Only meaningful on list reads: False when the sequence has senders but none currently has a connected mailbox.",
            "title": "Senders Ready",
            "type": "boolean"
          },
          "sending_priority": {
            "default": "new_contacts",
            "description": "Who gets scarce capacity first: new_contacts or follow_ups.",
            "title": "Sending Priority",
            "type": "string"
          },
          "sending_window": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sending Window"
          },
          "sending_window_problem": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingWindowProblemSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set when the saved sending_window breaks a rule a save now refuses, which only a window saved before those rules can. It still sends on it as stored: an unknown timezone is read as UTC, and no open day sends at any hour. Fix it by saving a valid sending_window."
          },
          "spending_limit_tenths": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spending Limit Tenths"
          },
          "status": {
            "$ref": "#/components/schemas/SequenceStatus"
          },
          "status_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status Column Id"
          },
          "step_count": {
            "title": "Step Count",
            "type": "integer"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/SequenceStepSchema-Output"
            },
            "title": "Steps",
            "type": "array"
          },
          "trashed_with_folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "In Trash only: the folder that took it there, which brings it back (POST /sequences/folders/{id}/restore/). Null when it went on its own.",
            "title": "Trashed With Folder Id"
          },
          "trashed_with_folder_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Single reads in Trash only: the name of trashed_with_folder_id's folder.",
            "title": "Trashed With Folder Name"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "audience_table_id",
          "audience_view_id",
          "column_mapping",
          "status_column_id",
          "sending_window",
          "multithreading",
          "opt_out_footer_text",
          "launched_at",
          "pause_reason",
          "created_at",
          "updated_at",
          "steps",
          "edges",
          "step_count",
          "browsers_stopping"
        ],
        "title": "SequencePauseReadSchema",
        "type": "object"
      },
      "SequencePausedContextSchema": {
        "description": "Context for a pause, and why it happened.",
        "properties": {
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "reason": {
            "default": "manual",
            "title": "Reason",
            "type": "string"
          },
          "type": {
            "const": "paused",
            "default": "paused",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequencePausedContextSchema",
        "type": "object"
      },
      "SequencePurgedContextSchema": {
        "description": "Context for a deletion for good from Trash, and the folder it went with.",
        "properties": {
          "folder_name": {
            "default": "",
            "title": "Folder Name",
            "type": "string"
          },
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "type": {
            "const": "purged",
            "default": "purged",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequencePurgedContextSchema",
        "type": "object"
      },
      "SequenceReadSchema": {
        "properties": {
          "audience_table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audience Table Id"
          },
          "audience_table_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only: the name of audience_table_id's table, which a sequence in Trash keeps its status and messages columns on. Null when it has none, or the table is in Trash too.",
            "title": "Audience Table Name"
          },
          "audience_view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Audience View Id"
          },
          "bcc_addresses": {
            "description": "Blind copies on every email this sequence sends.",
            "items": {
              "type": "string"
            },
            "title": "Bcc Addresses",
            "type": "array"
          },
          "browser_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Credits the sequence's Browser use runs were charged, all told (rollup, list reads only).",
            "title": "Browser Credits"
          },
          "browser_needs_human": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Of browser_runs, those that ended on Needs human (rollup, list reads only).",
            "title": "Browser Needs Human"
          },
          "browser_only": {
            "default": false,
            "description": "Whether every step that acts is a Browser use step (conditions aside), so the sequence sends nothing and has no reply rate: the list shows its browser_runs and browser_credits instead. Read live, never from the cached stats.",
            "title": "Browser Only",
            "type": "boolean"
          },
          "browser_runs": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Browser use runs that ended on an outcome, Needs human included (rollup, list reads only). None while the stats have not been built in this shape.",
            "title": "Browser Runs"
          },
          "cc_addresses": {
            "description": "Addresses copied on every email this sequence sends.",
            "items": {
              "type": "string"
            },
            "title": "Cc Addresses",
            "type": "array"
          },
          "column_mapping": {
            "$ref": "#/components/schemas/ColumnMappingSchema"
          },
          "connection_requests_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Connection Requests Sent"
          },
          "connections_accepted": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Connection requests from this sequence confirmed accepted. With connection_requests_sent this yields the acceptance rate.",
            "title": "Connections Accepted"
          },
          "contacts_added": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts still in the audience, as the Audience tab's All counts them. Since 2026-11-07 it leaves out the Removed tab's contacts (removed by hand, or their row deleted or out of the view). None when the list's stats have never been built and could not be built on this request (for example, another request was building them). Show a zero state, not a fake 0.",
            "title": "Contacts Added"
          },
          "contacts_blocked": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's Blocked tab (failed, bounced, in cooldown, mailbox removed, do not contact, in another sequence). Unreachable contacts count under In progress here; the Audience tab counts them under Blocked, because reachability is judged from the row as it reads now.",
            "title": "Contacts Blocked"
          },
          "contacts_done": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's Done tab (finished, replied, unsubscribed, stopped and the like). Removed contacts are counted nowhere here since 2026-11-07.",
            "title": "Contacts Done"
          },
          "contacts_failed": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: every contact whose step failed (rollup, list reads only). Read contacts_blocked, which counts them with everyone else the Audience tab files under Blocked.",
            "title": "Contacts Failed"
          },
          "contacts_finished": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: every contact who completed the cadence or stopped for any reason (rollup, list reads only). Read contacts_done and contacts_blocked, which split them as the Audience tab does.",
            "title": "Contacts Finished"
          },
          "contacts_in_progress": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rollup, list reads only: the contacts under the Audience tab's In progress, Needs approval and Paused tabs together. On a draft these are its contacts who start when it launches, which the list calls Not started. Unreachable contacts count under In progress here; the Audience tab counts them under Blocked, because reachability is judged from the row as it reads now. Since 2026-10-19 it also counts Needs approval and Paused contacts and a draft's waiting contacts; it counted only contacts moving before. None when the stats have not been built in this shape yet.",
            "title": "Contacts In Progress"
          },
          "contacts_not_started": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Deprecated, kept for API clients: a draft's contacts, who start when it launches (rollup, list reads only). Read contacts_in_progress, which on a draft counts the same contacts the list calls Not started.",
            "title": "Contacts Not Started"
          },
          "continuous_enrolment": {
            "default": false,
            "description": "TRUE keeps the audience live: rows added to the table later enrol on their own, and rows that leave it stop. FALSE (the default for a new sequence) freezes the audience after launch; rows can still be added to it by hand, through the add-to-sequence route.",
            "title": "Continuous Enrolment",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "deleted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it went to Trash; null for a live sequence. Trash deletes it for good 30 days after. A launched one went paused and comes back paused; a draft comes back a draft.",
            "title": "Deleted At"
          },
          "edges": {
            "items": {
              "$ref": "#/components/schemas/SequenceEdgeSchema"
            },
            "title": "Edges",
            "type": "array"
          },
          "email_approval_mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`manual` requires approval; `confident` adds approval for uncertain AI-written emails; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.",
            "title": "Email Approval Mode"
          },
          "emails_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Emails Sent"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder it is filed in on the Sequences list; null for the top level. A placement only: everyone in the workspace still opens every sequence. A folder that went to Trash leaves a live sequence still naming it at the top level.",
            "title": "Folder Id"
          },
          "folder_path": {
            "description": "The folders on the way to it, from the top level down, its own folder last; empty at the top level.",
            "items": {
              "$ref": "#/components/schemas/SequenceFolderCrumbSchema"
            },
            "title": "Folder Path",
            "type": "array"
          },
          "hold": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceListHoldSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only, read live on every request (never from the cached stats): on a running sequence nobody on which can move, the worst reason holding them (as GET /sequences/{id}/holds/ names it). Null while anybody moves and on any other status."
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_favorite": {
            "default": false,
            "description": "List reads only: whether the person asking starred the sequence. Their own, never a teammate's; always false for an API key.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "last_synced_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the audience-enrolment diff last completed. None until the first sync (launch runs one inline). The Audience tab shows this plus a manual trigger, never a background job the user cannot see.",
            "title": "Last Synced At"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "List reads only: when the person asking last opened the sequence; null when they never have, and for an API key.",
            "title": "Last Viewed At"
          },
          "launched_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Launched At"
          },
          "linkedin_approval_mode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "`manual` requires approval; `confident` adds approval for uncertain AI-written LinkedIn steps; null follows the sender. There is no value meaning 'send automatically': a sequence can only add an approval.",
            "title": "Linkedin Approval Mode"
          },
          "linkedin_check_max_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired. Acceptance checks now use the service-managed interval.",
            "title": "Linkedin Check Max Seconds"
          },
          "linkedin_check_min_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired. Acceptance checks now use the service-managed interval.",
            "title": "Linkedin Check Min Seconds"
          },
          "linkedin_messages_sent": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Messages Sent"
          },
          "multithreading": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Multithreading"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "opportunity_values": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "integer"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Dollars per outcome label; None = tracking off.",
            "title": "Opportunity Values"
          },
          "opt_out_footer_text": {
            "title": "Opt Out Footer Text",
            "type": "string"
          },
          "out_of_office_days_after": {
            "default": 0,
            "description": "How many business days after the return day the next step goes, 0 (the day they are back) to 5.",
            "title": "Out Of Office Days After",
            "type": "integer"
          },
          "out_of_office_wait": {
            "default": true,
            "description": "TRUE (the default) waits for a contact whose out-of-office reply says when they are back: their next step goes on that day, or out_of_office_days_after business days later, in the sending hours. It moves only a step that would have gone sooner. A return more than 30 days away counts as 30 days, and a reply naming no day waits 7 days. FALSE ignores the reply and goes on as planned.",
            "title": "Out Of Office Wait",
            "type": "boolean"
          },
          "outbound_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sequence's outbound agent: the writer of every agent-written step and of its replies. Read and configure it under /outbound-agents/{id}/.",
            "title": "Outbound Agent Id"
          },
          "pause_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pause Reason"
          },
          "plain_text_only": {
            "default": true,
            "description": "TRUE (recommended) sends no formatting: the bold, italic and link marks are stripped and the email reads as plain text; FALSE renders them. Either way the email carries an HTML part laid out line for line, which keeps its spacing exactly, beside a matching text part.",
            "title": "Plain Text Only",
            "type": "boolean"
          },
          "positive": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Threads labelled positive (rollup, list reads only).",
            "title": "Positive"
          },
          "positive_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Positive Rate"
          },
          "replies": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Distinct contacts who replied: reply_rate's numerator.",
            "title": "Replies"
          },
          "reply_rate": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "replies divided by the distinct people reached on any channel: sent an email, sent a LinkedIn message or InMail, or who accepted a connection request (rollup, list reads only).",
            "title": "Reply Rate"
          },
          "sender_profile_ids": {
            "description": "Only meaningful on list reads: the sequence's senders by id, in the same order as sender_profile_names.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Sender Profile Ids",
            "type": "array"
          },
          "sender_profile_names": {
            "description": "Only meaningful on list reads: the names of the sequence's senders.",
            "items": {
              "type": "string"
            },
            "title": "Sender Profile Names",
            "type": "array"
          },
          "senders_ready": {
            "default": true,
            "description": "Only meaningful on list reads: False when the sequence has senders but none currently has a connected mailbox.",
            "title": "Senders Ready",
            "type": "boolean"
          },
          "sending_priority": {
            "default": "new_contacts",
            "description": "Who gets scarce capacity first: new_contacts or follow_ups.",
            "title": "Sending Priority",
            "type": "string"
          },
          "sending_window": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sending Window"
          },
          "sending_window_problem": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingWindowProblemSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set when the saved sending_window breaks a rule a save now refuses, which only a window saved before those rules can. It still sends on it as stored: an unknown timezone is read as UTC, and no open day sends at any hour. Fix it by saving a valid sending_window."
          },
          "spending_limit_tenths": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spending Limit Tenths"
          },
          "status": {
            "$ref": "#/components/schemas/SequenceStatus"
          },
          "status_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status Column Id"
          },
          "step_count": {
            "title": "Step Count",
            "type": "integer"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/SequenceStepSchema-Output"
            },
            "title": "Steps",
            "type": "array"
          },
          "trashed_with_folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "In Trash only: the folder that took it there, which brings it back (POST /sequences/folders/{id}/restore/). Null when it went on its own.",
            "title": "Trashed With Folder Id"
          },
          "trashed_with_folder_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Single reads in Trash only: the name of trashed_with_folder_id's folder.",
            "title": "Trashed With Folder Name"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "audience_table_id",
          "audience_view_id",
          "column_mapping",
          "status_column_id",
          "sending_window",
          "multithreading",
          "opt_out_footer_text",
          "launched_at",
          "pause_reason",
          "created_at",
          "updated_at",
          "steps",
          "edges",
          "step_count"
        ],
        "title": "SequenceReadSchema",
        "type": "object"
      },
      "SequenceReplyStatsReadSchema": {
        "description": "What a sequence's replies came to, each reply counted in the sequence it came in on.",
        "properties": {
          "drafts": {
            "description": "Drafts written for these replies.",
            "title": "Drafts",
            "type": "integer"
          },
          "first_response_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The median time, in seconds, from a contact's first reply to your first answer after it; null before any is answered. An away notice or auto-reply never starts the clock.",
            "title": "First Response Seconds"
          },
          "labels": {
            "description": "Each label the replies carry, most replies first.",
            "items": {
              "$ref": "#/components/schemas/ReplyLabelCountReadSchema"
            },
            "title": "Labels",
            "type": "array"
          },
          "not_now": {
            "description": "Replies that said not now and named a date to come back, without asking to stop.",
            "title": "Not Now",
            "type": "integer"
          },
          "questions_answered": {
            "description": "Of those, the ones a person answered.",
            "title": "Questions Answered",
            "type": "integer"
          },
          "questions_asked": {
            "description": "Replies the agent asked a person about before it could answer.",
            "title": "Questions Asked",
            "type": "integer"
          },
          "replies": {
            "description": "Replies the agent has read, one per reply.",
            "title": "Replies",
            "type": "integer"
          },
          "reply_spend_tenths": {
            "description": "What writing the replies cost, in tenths of a credit, net of the refunds for replies that needed no answer by the time they were written. Reading a reply is free.",
            "title": "Reply Spend Tenths",
            "type": "integer"
          },
          "sent_as_written": {
            "description": "Drafts sent as the agent wrote them.",
            "title": "Sent As Written",
            "type": "integer"
          },
          "sent_edited": {
            "description": "Drafts a person changed before sending.",
            "title": "Sent Edited",
            "type": "integer"
          },
          "sent_replaced": {
            "description": "Drafts a person sent a reply of their own in place of.",
            "title": "Sent Replaced",
            "type": "integer"
          },
          "waiting_now": {
            "description": "Replies waiting on a person now: a draft to approve or questions to answer.",
            "title": "Waiting Now",
            "type": "integer"
          },
          "waiting_since": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the longest-waiting of those came in; null when none waits.",
            "title": "Waiting Since"
          }
        },
        "required": [
          "replies",
          "labels",
          "not_now",
          "drafts",
          "sent_as_written",
          "sent_edited",
          "sent_replaced",
          "questions_asked",
          "questions_answered",
          "waiting_now",
          "waiting_since",
          "first_response_seconds",
          "reply_spend_tenths"
        ],
        "title": "SequenceReplyStatsReadSchema",
        "type": "object"
      },
      "SequenceRestoreReadSchema": {
        "description": "A sequence taken out of Trash, and the contacts it could not take back.",
        "properties": {
          "contacts_held_elsewhere": {
            "description": "Contacts another sequence took while this one was in Trash. They stay stopped here (Stopped in Trash). One who replied, bounced or left the audience stops for that instead, and is not counted. A draft holds nobody, so it takes every contact back and this is 0. The rest are taken back where they stood, in the background, a moment after this answers.",
            "title": "Contacts Held Elsewhere",
            "type": "integer"
          },
          "sequence": {
            "$ref": "#/components/schemas/SequenceReadSchema"
          }
        },
        "required": [
          "sequence",
          "contacts_held_elsewhere"
        ],
        "title": "SequenceRestoreReadSchema",
        "type": "object"
      },
      "SequenceRestoredContextSchema": {
        "description": "Context for a restore from Trash, how many contacts stayed stopped, and its folder.",
        "properties": {
          "contacts_held_elsewhere": {
            "default": 0,
            "title": "Contacts Held Elsewhere",
            "type": "integer"
          },
          "folder_name": {
            "default": "",
            "title": "Folder Name",
            "type": "string"
          },
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "type": {
            "const": "restored",
            "default": "restored",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequenceRestoredContextSchema",
        "type": "object"
      },
      "SequenceResumedContextSchema": {
        "description": "Context for a resume.",
        "properties": {
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "type": {
            "const": "resumed",
            "default": "resumed",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequenceResumedContextSchema",
        "type": "object"
      },
      "SequenceSendersPutSchema": {
        "properties": {
          "sender_profile_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 100,
            "title": "Sender Profile Ids",
            "type": "array"
          }
        },
        "required": [
          "sender_profile_ids"
        ],
        "title": "SequenceSendersPutSchema",
        "type": "object"
      },
      "SequenceSendersSetSchema": {
        "description": "The senders a sequence sends as: the whole set, as stored.",
        "properties": {
          "data": {
            "description": "The ids of the senders the sequence sends as.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Data",
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "title": "SequenceSendersSetSchema",
        "type": "object"
      },
      "SequenceStartProgressReadSchema": {
        "description": "How far a launch's start has got; cheap enough to poll every two seconds.",
        "properties": {
          "starting": {
            "description": "Contacts due now plus those being worked on. The start is over when this is 0.",
            "title": "Starting",
            "type": "integer"
          },
          "tasks_waiting": {
            "description": "This sequence's tasks waiting on a person's approval.",
            "title": "Tasks Waiting",
            "type": "integer"
          }
        },
        "required": [
          "starting",
          "tasks_waiting"
        ],
        "title": "SequenceStartProgressReadSchema",
        "type": "object"
      },
      "SequenceStatus": {
        "description": "Lifecycle of a sequence.\n\nDRAFT until launch; RUNNING sequences are locked against structural edits\n(pause \u2192 edit \u2192 resume); PAUSED stops scheduling while leaving every\nenrolment exactly where it is; COMPLETED is terminal.",
        "enum": [
          "draft",
          "running",
          "paused",
          "completed"
        ],
        "title": "SequenceStatus",
        "type": "string"
      },
      "SequenceStepKind": {
        "description": "What a graph node does.\n\nThe LINKEDIN_* kinds do not send anything themselves. They enqueue browser\nwork and park the contact until it runs, because the action happens in the\ncustomer's own browser and that browser may be closed.\n\nEvery kind here is something the product can carry out end to end. There is\ndeliberately no phone-call or text-message kind: the engine cannot dial or\ntext, and a step it can only hand to a person to do elsewhere is a to-do\nlist wearing a sequence's clothes, not a channel this product supports.",
        "enum": [
          "message",
          "condition",
          "linkedin_profile_view",
          "linkedin_connection_request",
          "linkedin_message",
          "linkedin_inmail",
          "linkedin_withdraw_invitation",
          "linkedin_follow",
          "linkedin_like_post",
          "browser_use"
        ],
        "title": "SequenceStepKind",
        "type": "string"
      },
      "SequenceStepSchema-Input": {
        "properties": {
          "agent_prompt_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read-only: the agent's slot for this step's prompt (the step's id). Set by the server on every agent-written step; ignored on write.",
            "title": "Agent Prompt Key"
          },
          "agent_subject": {
            "default": false,
            "description": "On an agent-written email that starts a thread: the agent writes the subject line too, and `subject_segments` is ignored. Off, the typed subject is sent. Ignored on a reply and on written steps.",
            "title": "Agent Subject",
            "type": "boolean"
          },
          "authoring": {
            "$ref": "#/components/schemas/StepAuthoring",
            "default": "written",
            "description": "Who writes the words. 'written' sends the subject and body below; 'agent' has the sequence's outbound agent write them for each contact from `prompt`, the contact's row and the workspace's business context, priced per contact. An email, a connection note, a LinkedIn message or an InMail."
          },
          "body_segments": {
            "items": {
              "$ref": "#/components/schemas/TemplateSegmentSchema"
            },
            "title": "Body Segments",
            "type": "array"
          },
          "browser_config": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BrowserStepConfigSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "A Browser use step's goal, the outcomes it can end on (each its own branch, plus `needs_human`) and the values it brings back into columns. Left out, a Browser use step keeps the setup it has; a new one needs it, and null is refused. Ignored on every other kind of step."
          },
          "condition_kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceConditionKind"
              },
              {
                "type": "null"
              }
            ]
          },
          "condition_window_days": {
            "anyOf": [
              {
                "maximum": 90.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many days the step waits for its answer. On a check that waits (Email bounced?, or an older Replied? check), its window. On a connection request, how long it waits for the request to be accepted before the contact goes down its `not_accepted` branch: null is saved as 14, and a change holds every contact already waiting to the new window.",
            "title": "Condition Window Days"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/SequenceStepKind"
          },
          "position": {
            "default": 0,
            "minimum": 0.0,
            "title": "Position",
            "type": "integer"
          },
          "prompt": {
            "default": "",
            "description": "What the agent is asked to write at this step. Stored on the agent, not the step, and saved with the graph: this is the one way to change it.",
            "maxLength": 4000,
            "title": "Prompt",
            "type": "string"
          },
          "reply_to_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The earlier email step this email replies to: it goes out under that step's send to the contact (Re: its subject, In-Reply-To its Message-ID), from the mailbox that sent it. Must be an email step that comes before this one on the graph. Null starts a new thread. Only on email steps.",
            "title": "Reply To Step Id"
          },
          "requires_approval": {
            "default": false,
            "description": "Hold this step for approval even when its channel would run on its own. One-way: true adds an approval, false never removes the one the channel's resolved mode already wants.",
            "title": "Requires Approval",
            "type": "boolean"
          },
          "save_to_table": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "A LinkedIn profile view only: save the profile it reads into the sequence's 'LinkedIn profile' column (0.1 credit per saved profile). Left out keeps the stored setting; a new profile view step saves by default. Always false on every other kind of step.",
            "title": "Save To Table"
          },
          "subject_segments": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TemplateSegmentSchema"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The subject of an email that starts a thread. Ignored on a reply (`reply_to_step_id`), whose subject is the thread's, and on an email whose subject the agent writes (`agent_subject`). An email that starts a thread with neither fails preflight until a subject is added. A blank subject on an email after another one, with no `reply_to_step_id`, is saved as a reply to the nearest earlier email, which is what it used to mean.",
            "title": "Subject Segments"
          },
          "title": {
            "anyOf": [
              {
                "maxLength": 80,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the step is called on its card, in the customer's words: set by the library campaign that laid it out, or by whoever saves the graph. Null names it by its place in the cadence (Opener, New angle, Break-up). Sending the stored title back, or leaving it out, keeps it while the step keeps its kind and who writes it; a different title renames the step, and an empty one clears the name.",
            "title": "Title"
          },
          "wait_amount": {
            "default": 0,
            "maximum": 365.0,
            "minimum": 0.0,
            "title": "Wait Amount",
            "type": "integer"
          },
          "wait_unit": {
            "$ref": "#/components/schemas/SequenceWaitUnit",
            "default": "days"
          }
        },
        "required": [
          "id",
          "kind"
        ],
        "title": "SequenceStepSchema",
        "type": "object"
      },
      "SequenceStepSchema-Output": {
        "properties": {
          "agent_prompt_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read-only: the agent's slot for this step's prompt (the step's id). Set by the server on every agent-written step; ignored on write.",
            "title": "Agent Prompt Key"
          },
          "agent_subject": {
            "default": false,
            "description": "On an agent-written email that starts a thread: the agent writes the subject line too, and `subject_segments` is ignored. Off, the typed subject is sent. Ignored on a reply and on written steps.",
            "title": "Agent Subject",
            "type": "boolean"
          },
          "authoring": {
            "$ref": "#/components/schemas/StepAuthoring",
            "default": "written",
            "description": "Who writes the words. 'written' sends the subject and body below; 'agent' has the sequence's outbound agent write them for each contact from `prompt`, the contact's row and the workspace's business context, priced per contact. An email, a connection note, a LinkedIn message or an InMail."
          },
          "body_segments": {
            "items": {
              "$ref": "#/components/schemas/TemplateSegmentSchema"
            },
            "title": "Body Segments",
            "type": "array"
          },
          "browser_config": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BrowserStepConfigSchema-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "A Browser use step's goal, the outcomes it can end on (each its own branch, plus `needs_human`) and the values it brings back into columns. Left out, a Browser use step keeps the setup it has; a new one needs it, and null is refused. Ignored on every other kind of step."
          },
          "condition_kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceConditionKind"
              },
              {
                "type": "null"
              }
            ]
          },
          "condition_window_days": {
            "anyOf": [
              {
                "maximum": 90.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many days the step waits for its answer. On a check that waits (Email bounced?, or an older Replied? check), its window. On a connection request, how long it waits for the request to be accepted before the contact goes down its `not_accepted` branch: null is saved as 14, and a change holds every contact already waiting to the new window.",
            "title": "Condition Window Days"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/SequenceStepKind"
          },
          "position": {
            "default": 0,
            "minimum": 0.0,
            "title": "Position",
            "type": "integer"
          },
          "prompt": {
            "default": "",
            "description": "What the agent is asked to write at this step. Stored on the agent, not the step, and saved with the graph: this is the one way to change it.",
            "maxLength": 4000,
            "title": "Prompt",
            "type": "string"
          },
          "reply_to_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The earlier email step this email replies to: it goes out under that step's send to the contact (Re: its subject, In-Reply-To its Message-ID), from the mailbox that sent it. Must be an email step that comes before this one on the graph. Null starts a new thread. Only on email steps.",
            "title": "Reply To Step Id"
          },
          "requires_approval": {
            "default": false,
            "description": "Hold this step for approval even when its channel would run on its own. One-way: true adds an approval, false never removes the one the channel's resolved mode already wants.",
            "title": "Requires Approval",
            "type": "boolean"
          },
          "save_to_table": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "A LinkedIn profile view only: save the profile it reads into the sequence's 'LinkedIn profile' column (0.1 credit per saved profile). Left out keeps the stored setting; a new profile view step saves by default. Always false on every other kind of step.",
            "title": "Save To Table"
          },
          "subject_segments": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TemplateSegmentSchema"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The subject of an email that starts a thread. Ignored on a reply (`reply_to_step_id`), whose subject is the thread's, and on an email whose subject the agent writes (`agent_subject`). An email that starts a thread with neither fails preflight until a subject is added. A blank subject on an email after another one, with no `reply_to_step_id`, is saved as a reply to the nearest earlier email, which is what it used to mean.",
            "title": "Subject Segments"
          },
          "title": {
            "anyOf": [
              {
                "maxLength": 80,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the step is called on its card, in the customer's words: set by the library campaign that laid it out, or by whoever saves the graph. Null names it by its place in the cadence (Opener, New angle, Break-up). Sending the stored title back, or leaving it out, keeps it while the step keeps its kind and who writes it; a different title renames the step, and an empty one clears the name.",
            "title": "Title"
          },
          "wait_amount": {
            "default": 0,
            "maximum": 365.0,
            "minimum": 0.0,
            "title": "Wait Amount",
            "type": "integer"
          },
          "wait_unit": {
            "$ref": "#/components/schemas/SequenceWaitUnit",
            "default": "days"
          }
        },
        "required": [
          "id",
          "kind"
        ],
        "title": "SequenceStepSchema",
        "type": "object"
      },
      "SequenceTemplateCreateSchema": {
        "properties": {
          "name": {
            "maxLength": 200,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "sequence_id": {
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          }
        },
        "required": [
          "sequence_id",
          "name"
        ],
        "title": "SequenceTemplateCreateSchema",
        "type": "object"
      },
      "SequenceTemplateReadSchema": {
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "sequence": {
            "$ref": "#/components/schemas/SequenceReadSchema"
          }
        },
        "required": [
          "id",
          "name",
          "created_at",
          "sequence"
        ],
        "title": "SequenceTemplateReadSchema",
        "type": "object"
      },
      "SequenceTemplateUseSchema": {
        "description": "Request body for making a draft from a saved template.",
        "properties": {
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder on the Sequences list to file it in; null for the top level.",
            "title": "Folder Id"
          }
        },
        "title": "SequenceTemplateUseSchema",
        "type": "object"
      },
      "SequenceTrainingActionSchema": {
        "properties": {
          "expected_revision": {
            "minimum": 1.0,
            "title": "Expected Revision",
            "type": "integer"
          }
        },
        "required": [
          "expected_revision"
        ],
        "title": "SequenceTrainingActionSchema",
        "type": "object"
      },
      "SequenceTrainingAdoptSchema": {
        "properties": {
          "record_ids": {
            "description": "The audience rows whose threads were already written as previews, between one and ten different ones.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 10,
            "minItems": 1,
            "title": "Record Ids",
            "type": "array"
          }
        },
        "required": [
          "record_ids"
        ],
        "title": "SequenceTrainingAdoptSchema",
        "type": "object"
      },
      "SequenceTrainingAudienceContactSchema": {
        "properties": {
          "label": {
            "title": "Label",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          }
        },
        "required": [
          "record_id",
          "label"
        ],
        "title": "SequenceTrainingAudienceContactSchema",
        "type": "object"
      },
      "SequenceTrainingContactFieldSchema": {
        "properties": {
          "name": {
            "title": "Name",
            "type": "string"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "name",
          "value"
        ],
        "title": "SequenceTrainingContactFieldSchema",
        "type": "object"
      },
      "SequenceTrainingContactReadSchema": {
        "properties": {
          "context": {
            "additionalProperties": {
              "type": "string"
            },
            "title": "Context",
            "type": "object"
          },
          "fields": {
            "description": "The contact's own columns as the run froze them, read the way the approval queue lists a contact: each fact once, a whole-record column opened into its facts.",
            "items": {
              "$ref": "#/components/schemas/SequenceTrainingContactFieldSchema"
            },
            "title": "Fields",
            "type": "array"
          },
          "label": {
            "title": "Label",
            "type": "string"
          },
          "messages": {
            "items": {
              "$ref": "#/components/schemas/SequenceTrainingMessageReadSchema"
            },
            "title": "Messages",
            "type": "array"
          },
          "profile_mismatch": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the contact's LinkedIn profile says that their row does not, usually a job change the row has not caught up with, as one sentence: 'LinkedIn says Operations Leader at Chamber Media; the row says Sealed.' Null when they agree or no profile was read.",
            "title": "Profile Mismatch"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender these messages were written as, when the run chose one: where a message held because this sender always asks is changed.",
            "title": "Sender Profile Id"
          },
          "verdict": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContactReviewVerdict"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "record_id",
          "label",
          "context",
          "fields",
          "messages",
          "verdict"
        ],
        "title": "SequenceTrainingContactReadSchema",
        "type": "object"
      },
      "SequenceTrainingMessageReadSchema": {
        "properties": {
          "authored": {
            "title": "Authored",
            "type": "boolean"
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Body"
          },
          "conditional": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Conditional"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "facts_used": {
            "items": {
              "type": "string"
            },
            "title": "Facts Used",
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "title": "Kind",
            "type": "string"
          },
          "looks_good": {
            "default": false,
            "description": "These very words are marked Looks good, so they are what sends: by the thread's Looks good, or on their own from the Builder, which marks one email at a time.",
            "title": "Looks Good",
            "type": "boolean"
          },
          "reasoning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reasoning"
          },
          "reply_to_step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step whose thread this message replies in, or null when it opens a thread of its own.",
            "title": "Reply To Step Id"
          },
          "send": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceTrainingSendSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the agent's words would send on their own or wait for approval, under the sequence's settings as they stand. Null for a message a person typed, one not written, or when nothing would send it (no sender, no LinkedIn account)."
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/AiStep"
            },
            "title": "Steps",
            "type": "array"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Subject"
          },
          "timing": {
            "title": "Timing",
            "type": "string"
          },
          "title": {
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "timing",
          "kind",
          "authored",
          "conditional",
          "subject",
          "body",
          "error",
          "reasoning",
          "facts_used",
          "steps",
          "reply_to_step_id"
        ],
        "title": "SequenceTrainingMessageReadSchema",
        "type": "object"
      },
      "SequenceTrainingNextSchema": {
        "description": "The contact the AI writing tab shows after the one on screen.",
        "properties": {
          "in_tasks": {
            "default": 0,
            "description": "When there is nobody next: how many other contacts were passed over because their email waits for approval in Tasks, where it is approved or changed. 0 otherwise.",
            "title": "In Tasks",
            "type": "integer"
          },
          "in_tasks_names": {
            "description": "The first names of up to three of those contacts, in the audience's order; a contact whose row carries no first name is counted in `in_tasks` but not named.",
            "items": {
              "type": "string"
            },
            "title": "In Tasks Names",
            "type": "array"
          },
          "label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their name, as the Preview's picker shows it.",
            "title": "Label"
          },
          "record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The next contact in the audience's order that nobody has judged in this run, has no words pinned already and can be reached. Null when there is none.",
            "title": "Record Id"
          }
        },
        "required": [
          "record_id",
          "label"
        ],
        "title": "SequenceTrainingNextSchema",
        "type": "object"
      },
      "SequenceTrainingPreviewsReadSchema": {
        "description": "The Preview once it keeps threads already written, and which of them to write again.",
        "properties": {
          "session": {
            "$ref": "#/components/schemas/SequenceTrainingReadSchema"
          },
          "write_again": {
            "description": "Contacts whose kept thread was written before the plain-words check and uses jargon the writing rules forbid or a business context sentence word for word. Writing them again (the step preview with fresh) replaces those words; the AI writing tab shows the thread as it is meanwhile.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Write Again",
            "type": "array"
          }
        },
        "required": [
          "session",
          "write_again"
        ],
        "title": "SequenceTrainingPreviewsReadSchema",
        "type": "object"
      },
      "SequenceTrainingReadSchema": {
        "properties": {
          "agent_id": {
            "format": "uuid",
            "title": "Agent Id",
            "type": "string"
          },
          "base_version": {
            "title": "Base Version",
            "type": "integer"
          },
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/SequenceTrainingContactReadSchema"
            },
            "title": "Contacts",
            "type": "array"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "reviewed_ids": {
            "description": "Every contact given Looks good in this run, including ones that left the run to make room.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Reviewed Ids",
            "type": "array"
          },
          "revision": {
            "title": "Revision",
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/ContactTrainingStatus"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/AiStep"
            },
            "title": "Steps",
            "type": "array"
          }
        },
        "required": [
          "id",
          "agent_id",
          "status",
          "revision",
          "base_version",
          "contacts",
          "error",
          "created_at"
        ],
        "title": "SequenceTrainingReadSchema",
        "type": "object"
      },
      "SequenceTrainingReviewSchema": {
        "properties": {
          "expected_revision": {
            "minimum": 1.0,
            "title": "Expected Revision",
            "type": "integer"
          },
          "rev": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's feedback session `rev` as read, not the Preview's `expected_revision`. When sent with Looks good, a session a note or an edit changed since is refused (409) and nothing is recorded; left out, it saves the session as it stands.",
            "title": "Rev"
          },
          "verdict": {
            "$ref": "#/components/schemas/ContactReviewVerdict",
            "description": "`good` (Looks good) or `skipped`. Needs work is not a verdict here: it is a thumbs down on the contact (`POST /agent-learnings/thumbs-downs/`, kind `writing_preview`), which asks what's wrong, saves a learning and writes the thread again; `bad` is refused."
          }
        },
        "required": [
          "expected_revision",
          "verdict"
        ],
        "title": "SequenceTrainingReviewSchema",
        "type": "object"
      },
      "SequenceTrainingSendSchema": {
        "description": "Whether a message would leave on its own when its turn comes, and if not, why.",
        "properties": {
          "alone": {
            "description": "True when the send would let these words go without a person; false when they would wait for approval in Tasks.",
            "title": "Alone",
            "type": "boolean"
          },
          "doubt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the words themselves hold the message (the agent did not rate them high, or knew too little): the agent's reason for its rating. Null otherwise.",
            "title": "Doubt"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AskReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why they would wait, in the approval queue's own reasons; null when alone."
          }
        },
        "required": [
          "alone",
          "reason"
        ],
        "title": "SequenceTrainingSendSchema",
        "type": "object"
      },
      "SequenceTrainingStartSchema": {
        "properties": {
          "close_open": {
            "default": false,
            "description": "Close the sequence's open Preview first, keeping its reviews, and start a new one. Without it the contacts join the open Preview, so the ones already written stay; a contact already in it is written again. Still refused while that Preview is writing.",
            "title": "Close Open",
            "type": "boolean"
          },
          "record_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 10,
            "minItems": 1,
            "title": "Record Ids",
            "type": "array"
          }
        },
        "required": [
          "record_ids"
        ],
        "title": "SequenceTrainingStartSchema",
        "type": "object"
      },
      "SequenceTrainingWithMatchReadSchema": {
        "description": "A Preview beside whether it still matches the sequence.",
        "properties": {
          "agent_id": {
            "format": "uuid",
            "title": "Agent Id",
            "type": "string"
          },
          "base_version": {
            "title": "Base Version",
            "type": "integer"
          },
          "contacts": {
            "items": {
              "$ref": "#/components/schemas/SequenceTrainingContactReadSchema"
            },
            "title": "Contacts",
            "type": "array"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "matches_sequence": {
            "description": "Whether the Preview was written against the sequence's steps, audience and column mapping as they are now.",
            "title": "Matches Sequence",
            "type": "boolean"
          },
          "reviewed_ids": {
            "description": "Every contact given Looks good in this run, including ones that left the run to make room.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Reviewed Ids",
            "type": "array"
          },
          "revision": {
            "title": "Revision",
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/ContactTrainingStatus"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/AiStep"
            },
            "title": "Steps",
            "type": "array"
          }
        },
        "required": [
          "id",
          "agent_id",
          "status",
          "revision",
          "base_version",
          "contacts",
          "error",
          "created_at",
          "matches_sequence"
        ],
        "title": "SequenceTrainingWithMatchReadSchema",
        "type": "object"
      },
      "SequenceTrashedContextSchema": {
        "description": "Context for a move to Trash, and the folder it went with (empty when on its own).",
        "properties": {
          "folder_name": {
            "default": "",
            "title": "Folder Name",
            "type": "string"
          },
          "name": {
            "default": "",
            "title": "Name",
            "type": "string"
          },
          "type": {
            "const": "trashed",
            "default": "trashed",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "SequenceTrashedContextSchema",
        "type": "object"
      },
      "SequenceUpdateSchema": {
        "properties": {
          "bcc_addresses": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "maxItems": 5,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Bcc Addresses"
          },
          "cc_addresses": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "maxItems": 5,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cc Addresses"
          },
          "continuous_enrolment": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Continuous Enrolment"
          },
          "email_approval_mode": {
            "anyOf": [
              {
                "maxLength": 16,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email Approval Mode"
          },
          "expected_updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The updated_at the client last saw; a stale value is refused with 409 instead of clobbering a concurrent editor.",
            "title": "Expected Updated At"
          },
          "linkedin_approval_mode": {
            "anyOf": [
              {
                "maxLength": 16,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Linkedin Approval Mode"
          },
          "linkedin_check_max_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired. Acceptance checks now use the service-managed interval.",
            "title": "Linkedin Check Max Seconds"
          },
          "linkedin_check_min_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired. Acceptance checks now use the service-managed interval.",
            "title": "Linkedin Check Min Seconds"
          },
          "multithreading": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Multithreading"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "opportunity_values": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "integer"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Opportunity Values"
          },
          "opt_out_footer_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Opt Out Footer Text"
          },
          "out_of_office_days_after": {
            "anyOf": [
              {
                "maximum": 5.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Business days after the return day the next step goes; 0 is that day.",
            "title": "Out Of Office Days After"
          },
          "out_of_office_wait": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Wait for a contact whose out-of-office reply says when they are back.",
            "title": "Out Of Office Wait"
          },
          "plain_text_only": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Plain Text Only"
          },
          "sending_priority": {
            "anyOf": [
              {
                "maxLength": 16,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sending Priority"
          },
          "sending_window": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SendingWindowSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the sequence may send; replaces the whole window. Null clears it, which sends at any hour with automatic spacing. Leave it out to keep the one it has."
          },
          "spending_limit_tenths": {
            "anyOf": [
              {
                "maximum": 1000000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spending Limit Tenths"
          }
        },
        "title": "SequenceUpdateSchema",
        "type": "object"
      },
      "SequenceUserPrefsReadSchema": {
        "description": "One person's relationship with one sequence.\n\nPer PERSON: two people in the same organisation are meant to disagree about\nwhat they have starred.",
        "properties": {
          "is_favorite": {
            "description": "Whether this person starred the sequence.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this person last opened the sequence; null means never.",
            "title": "Last Viewed At"
          }
        },
        "required": [
          "is_favorite",
          "last_viewed_at"
        ],
        "title": "SequenceUserPrefsReadSchema",
        "type": "object"
      },
      "SequenceWaitUnit": {
        "enum": [
          "days",
          "hours"
        ],
        "title": "SequenceWaitUnit",
        "type": "string"
      },
      "SequenceWriteFromColumnReadSchema": {
        "description": "One audience column the agent writes from as an angle the team prepared.",
        "properties": {
          "column_id": {
            "description": "The column's id; the agent skips it while this id is in its config's write_from_excluded_column_ids.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "name": {
            "description": "The column's name, as the table's header shows it.",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "column_id",
          "name"
        ],
        "title": "SequenceWriteFromColumnReadSchema",
        "type": "object"
      },
      "ServerErrorResponse": {
        "properties": {
          "detail": {
            "description": "The detail of why the server returned an error.",
            "title": "Detail",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "title": "ServerErrorResponse",
        "type": "object"
      },
      "SessionChangeUpdateSchema": {
        "description": "Change one change of a waiting feedback session, before the page's yes saves it.",
        "properties": {
          "off": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True leaves it out of the save; false brings it back.",
            "title": "Off"
          },
          "rev": {
            "description": "The session's `rev` as read: a change made against an older set is refused (409).",
            "minimum": 0.0,
            "title": "Rev",
            "type": "integer"
          },
          "scope": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposedScope"
              },
              {
                "type": "null"
              }
            ],
            "description": "`sequence` or `account`, on a new or rewritten learning only. A rewrite kept beside every sequence's learning stays this sequence's."
          },
          "text": {
            "anyOf": [
              {
                "maxLength": 4000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Its words: a learning's (add or update, one line, 1 to 300 characters), or an instruction edit's new words. Other kinds take none.",
            "title": "Text"
          }
        },
        "required": [
          "rev"
        ],
        "title": "SessionChangeUpdateSchema",
        "type": "object"
      },
      "SessionNoteReadSchema": {
        "description": "One note of a feedback session and the AI's reply to it.",
        "properties": {
          "at": {
            "description": "When it was given.",
            "format": "date-time",
            "title": "At",
            "type": "string"
          },
          "dropped": {
            "description": "Changes of earlier notes this note took back.",
            "items": {
              "$ref": "#/components/schemas/DroppedChangeReadSchema"
            },
            "title": "Dropped",
            "type": "array"
          },
          "kind": {
            "$ref": "#/components/schemas/ThreadNoteKind",
            "description": "`note` a person typed, or `edit`: a person's own edit of the words."
          },
          "number": {
            "description": "From 1, oldest first: what a change's `note` names.",
            "title": "Number",
            "type": "integer"
          },
          "reply": {
            "description": "The AI's reply: what it changed and what it kept to this item.",
            "title": "Reply",
            "type": "string"
          },
          "text": {
            "description": "The note; for an edit, the passages changed.",
            "title": "Text",
            "type": "string"
          },
          "user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who gave it.",
            "title": "User Id"
          },
          "words": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The words the note was given on, before its rewrite: what the page marks the rewrite against. Null when not kept.",
            "title": "Words"
          }
        },
        "required": [
          "number",
          "kind",
          "text",
          "user_id",
          "at",
          "reply",
          "words",
          "dropped"
        ],
        "title": "SessionNoteReadSchema",
        "type": "object"
      },
      "SharedLearningReadSchema": {
        "description": "A rule two or more sequences each keep for themselves (F16).",
        "properties": {
          "in_account": {
            "description": "All sequences keep it already: moving it only removes the copies.",
            "title": "In Account",
            "type": "boolean"
          },
          "learning_ids": {
            "description": "Every copy, newest first: what Move to All sequences takes.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Learning Ids",
            "type": "array"
          },
          "sequences": {
            "description": "The sequences keeping a copy, in the same order.",
            "items": {
              "$ref": "#/components/schemas/SharedLearningSequenceSchema"
            },
            "title": "Sequences",
            "type": "array"
          },
          "text": {
            "description": "The rule, as its newest copy says it.",
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text",
          "learning_ids",
          "sequences",
          "in_account"
        ],
        "title": "SharedLearningReadSchema",
        "type": "object"
      },
      "SharedLearningSequenceSchema": {
        "description": "One sequence keeping its own copy of a shared rule.",
        "properties": {
          "name": {
            "description": "The sequence, by its own name.",
            "title": "Name",
            "type": "string"
          },
          "saved_agent_id": {
            "description": "The sequence's outbound agent.",
            "format": "uuid",
            "title": "Saved Agent Id",
            "type": "string"
          }
        },
        "required": [
          "saved_agent_id",
          "name"
        ],
        "title": "SharedLearningSequenceSchema",
        "type": "object"
      },
      "SharedTableTemplateColumnSchema": {
        "description": "One column of a published template.",
        "properties": {
          "column_type": {
            "$ref": "#/components/schemas/TableColumnType"
          },
          "definition": {
            "$ref": "#/components/schemas/TableColumnDefinition-Output",
            "description": "The column's configuration, verbatim: the recipe being shared."
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Author's note; null when unset.",
            "title": "Description"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "holds": {
            "description": "What this column holds, in words (\"An email address\", \"A date\"). Stands in for an example value: a template never carries one of the owner's cells.",
            "title": "Holds",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/TableColumnKind"
          },
          "sample_value": {
            "description": "Always null. Kept so older callers keep parsing; a template never serves a real row's value. Read `holds` instead.",
            "title": "Sample Value",
            "type": "null"
          }
        },
        "required": [
          "display_name",
          "description",
          "kind",
          "column_type",
          "definition",
          "holds"
        ],
        "title": "SharedTableTemplateColumnSchema",
        "type": "object"
      },
      "SharedTableTemplateSchema": {
        "description": "A table's published shape.\n\nDeliberately NOT a `TableReadSchema`: this is served without sign-in, so\nevery field on it is a decision rather than an inheritance. Row counts,\norg, timestamps and run settings are all absent because none of them are\npart of a recipe.",
        "properties": {
          "columns": {
            "items": {
              "$ref": "#/components/schemas/SharedTableTemplateColumnSchema"
            },
            "title": "Columns",
            "type": "array"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "columns"
        ],
        "title": "SharedTableTemplateSchema",
        "type": "object"
      },
      "SignalCompaniesQuerySchema": {
        "description": "Filters for a company buying-signal search.",
        "properties": {
          "company_domains": {
            "description": "Only signals from these company domains. Up to 100.",
            "items": {
              "type": "string"
            },
            "maxItems": 100,
            "title": "Company Domains",
            "type": "array"
          },
          "content_competitors_mentioned": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Competitors named in the text a signal was drawn from. Exact company names."
          },
          "content_initiatives": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Plans and projects named in the text a signal was drawn from."
          },
          "content_keywords": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Match the words in the text a signal was drawn from. Only the social signal types carry text, and the data source refuses a content filter beside any other type."
          },
          "content_pain_points": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Problems named in the text a signal was drawn from."
          },
          "content_tech_mentioned": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Technologies named in the text a signal was drawn from. Exact product names: Salesforce matches, Sales does not."
          },
          "detected_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only signals detected on or after this day, as YYYY-MM-DD.",
            "title": "Detected After"
          },
          "detected_before": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only signals detected on or before this day, as YYYY-MM-DD.",
            "title": "Detected Before"
          },
          "employee_count": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's employee count."
          },
          "industries": {
            "description": "Only signals from companies in these industries. Up to 25, each matched as a case-insensitive substring of the data source's own industry labels; a value matching none of them is refused upstream.",
            "items": {
              "type": "string"
            },
            "maxItems": 25,
            "title": "Industries",
            "type": "array"
          },
          "revenue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Annual revenue in US dollars. The data source filters by named revenue band, so each bound is mapped to the band that contains it."
          },
          "signal_subtypes": {
            "description": "At most one narrower kind within the chosen signal, where it offers any. Optional: a signal with no subtypes sends none.",
            "items": {
              "type": "string"
            },
            "maxItems": 1,
            "title": "Signal Subtypes",
            "type": "array"
          },
          "signal_types": {
            "description": "Which buying signal to look for: exactly one. It is required, and no other filter can anchor a signals search on its own.",
            "items": {
              "type": "string"
            },
            "maxItems": 1,
            "title": "Signal Types",
            "type": "array"
          },
          "signals_per_entity": {
            "anyOf": [
              {
                "maximum": 100.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many of each company's or person's most recent matching signals to attach to its row; 25 when unset. Each company or person is one row however many signals it has, so this changes neither how many rows a search adds nor what they cost, and `signal_count` still gives the total.",
            "title": "Signals Per Entity"
          }
        },
        "title": "SignalCompaniesQuerySchema",
        "type": "object"
      },
      "SignalPeopleQuerySchema": {
        "description": "Filters for a person activity-signal search.",
        "properties": {
          "company_domains": {
            "description": "Only signals from these company domains. Up to 100.",
            "items": {
              "type": "string"
            },
            "maxItems": 100,
            "title": "Company Domains",
            "type": "array"
          },
          "content_competitors_mentioned": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Competitors named in the text a signal was drawn from. Exact company names."
          },
          "content_initiatives": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Plans and projects named in the text a signal was drawn from."
          },
          "content_keywords": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Match the words in the text a signal was drawn from. Only the social signal types carry text, and the data source refuses a content filter beside any other type."
          },
          "content_pain_points": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Problems named in the text a signal was drawn from."
          },
          "content_tech_mentioned": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContentFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Technologies named in the text a signal was drawn from. Exact product names: Salesforce matches, Sales does not."
          },
          "department": {
            "description": "Only people in these departments, from the data source's own list of eighteen. Any other value is refused.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Department",
            "type": "array"
          },
          "detected_after": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only signals detected on or after this day, as YYYY-MM-DD.",
            "title": "Detected After"
          },
          "detected_before": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only signals detected on or before this day, as YYYY-MM-DD.",
            "title": "Detected Before"
          },
          "employee_count": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's employee count."
          },
          "industries": {
            "description": "Only signals from companies in these industries. Up to 25, each matched as a case-insensitive substring of the data source's own industry labels; a value matching none of them is refused upstream.",
            "items": {
              "type": "string"
            },
            "maxItems": 25,
            "title": "Industries",
            "type": "array"
          },
          "job_title": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only people whose job title matches this text.",
            "title": "Job Title"
          },
          "revenue": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RangeFilterSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "Annual revenue in US dollars. The data source filters by named revenue band, so each bound is mapped to the band that contains it."
          },
          "seniority": {
            "description": "Only people at these seniority levels.",
            "items": {
              "enum": [
                "Staff",
                "Manager",
                "Director",
                "Vp",
                "Cxo"
              ],
              "type": "string"
            },
            "maxItems": 5,
            "title": "Seniority",
            "type": "array"
          },
          "signal_subtypes": {
            "description": "At most one narrower kind within the chosen signal, where it offers any. Optional: a signal with no subtypes sends none.",
            "items": {
              "type": "string"
            },
            "maxItems": 1,
            "title": "Signal Subtypes",
            "type": "array"
          },
          "signal_types": {
            "description": "Which buying signal to look for: exactly one. It is required, and no other filter can anchor a signals search on its own.",
            "items": {
              "type": "string"
            },
            "maxItems": 1,
            "title": "Signal Types",
            "type": "array"
          },
          "signals_per_entity": {
            "anyOf": [
              {
                "maximum": 100.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many of each company's or person's most recent matching signals to attach to its row; 25 when unset. Each company or person is one row however many signals it has, so this changes neither how many rows a search adds nor what they cost, and `signal_count` still gives the total.",
            "title": "Signals Per Entity"
          }
        },
        "title": "SignalPeopleQuerySchema",
        "type": "object"
      },
      "SignupRecordReadSchema": {
        "description": "The outcome of announcing a signup.\n\nAlways 200. A person who was already announced, or whose account is older\nthan the registration window, reports `recorded: false`: neither is\nsomething to alarm a new user about.",
        "properties": {
          "recorded": {
            "description": "Whether this call announced the caller's signup.",
            "title": "Recorded",
            "type": "boolean"
          }
        },
        "required": [
          "recorded"
        ],
        "title": "SignupRecordReadSchema",
        "type": "object"
      },
      "SignupSourceClaimReadSchema": {
        "description": "The outcome of recording a signup source.\n\nAlways 200 for a well formed body. A workspace that already has a source\nkeeps it, and one that is no longer registering gets none: both report\n`recorded: false`, because neither is something to alarm a new user about.",
        "properties": {
          "recorded": {
            "description": "Whether this call recorded the source for the workspace.",
            "title": "Recorded",
            "type": "boolean"
          }
        },
        "required": [
          "recorded"
        ],
        "title": "SignupSourceClaimReadSchema",
        "type": "object"
      },
      "SignupSourceClaimRequestSchema": {
        "description": "The source a new workspace's first link carried, sent once after signup.",
        "properties": {
          "src": {
            "anyOf": [
              {
                "maxLength": 100,
                "minLength": 1,
                "pattern": "^[a-z0-9-]+$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The marketing site's own source tag from the register link's `src` parameter, `<lane>-<slug>[-<slot>]`, for example `blog-what-is-data-enrichment-moment`.",
            "title": "Src"
          },
          "utm_campaign": {
            "anyOf": [
              {
                "maxLength": 100,
                "minLength": 1,
                "pattern": "^[a-z0-9._-]+$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The register link's `utm_campaign` parameter, if it had one.",
            "title": "Utm Campaign"
          },
          "utm_medium": {
            "anyOf": [
              {
                "maxLength": 100,
                "minLength": 1,
                "pattern": "^[a-z0-9._-]+$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The register link's `utm_medium` parameter, if it had one.",
            "title": "Utm Medium"
          },
          "utm_source": {
            "anyOf": [
              {
                "maxLength": 100,
                "minLength": 1,
                "pattern": "^[a-z0-9._-]+$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The register link's `utm_source` parameter, if it had one.",
            "title": "Utm Source"
          }
        },
        "title": "SignupSourceClaimRequestSchema",
        "type": "object"
      },
      "SlackAuthorizeUrlSchema": {
        "properties": {
          "authorize_url": {
            "title": "Authorize Url",
            "type": "string"
          }
        },
        "required": [
          "authorize_url"
        ],
        "title": "SlackAuthorizeUrlSchema",
        "type": "object"
      },
      "SlackCallbackSchema": {
        "properties": {
          "code": {
            "maxLength": 512,
            "minLength": 1,
            "title": "Code",
            "type": "string"
          },
          "state": {
            "maxLength": 256,
            "minLength": 1,
            "title": "State",
            "type": "string"
          }
        },
        "required": [
          "code",
          "state"
        ],
        "title": "SlackCallbackSchema",
        "type": "object"
      },
      "SlackChannelReadSchema": {
        "properties": {
          "id": {
            "title": "Id",
            "type": "string"
          },
          "is_private": {
            "title": "Is Private",
            "type": "boolean"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "is_private"
        ],
        "title": "SlackChannelReadSchema",
        "type": "object"
      },
      "SlackConnectionReadSchema": {
        "properties": {
          "connected_by_user_id": {
            "title": "Connected By User Id",
            "type": "string"
          },
          "team_id": {
            "title": "Team Id",
            "type": "string"
          },
          "team_name": {
            "title": "Team Name",
            "type": "string"
          }
        },
        "required": [
          "team_id",
          "team_name",
          "connected_by_user_id"
        ],
        "title": "SlackConnectionReadSchema",
        "type": "object"
      },
      "SourceColumnDefinition": {
        "description": "Definition of a source column: one imported record, held verbatim.\n\nCarries no configuration of its own. What to import, from where, and how\noften lives on the table's ``table_import_integration`` row, which points back here\nthrough ``object_column_id``; duplicating any of it on the column would\nonly create somewhere for the two to disagree.",
        "properties": {
          "kind": {
            "const": "source",
            "default": "source",
            "title": "Kind",
            "type": "string"
          }
        },
        "title": "SourceColumnDefinition",
        "type": "object"
      },
      "SourceFieldSchema": {
        "description": "One field discoverable on an imported record.",
        "properties": {
          "declared": {
            "description": "True when the provider lists this field in its own schema. A declared field with no sample value is one every sampled record left empty, still promotable.",
            "title": "Declared",
            "type": "boolean"
          },
          "label": {
            "description": "Humanized name, for a column header.",
            "title": "Label",
            "type": "string"
          },
          "path": {
            "description": "Dotted path into the object; ready for a formula.",
            "title": "Path",
            "type": "string"
          },
          "property_type": {
            "$ref": "#/components/schemas/PropertyType",
            "description": "The type a promoted column would store."
          },
          "sample_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "An example from the sampled records.",
            "title": "Sample Value"
          }
        },
        "required": [
          "path",
          "label",
          "property_type",
          "declared",
          "sample_value"
        ],
        "title": "SourceFieldSchema",
        "type": "object"
      },
      "SourceIdentityOptionSchema": {
        "description": "A key an existing table's rows could be matched on, and what switching would do.",
        "properties": {
          "available": {
            "description": "Whether the table can switch to it now.",
            "title": "Available",
            "type": "boolean"
          },
          "current": {
            "description": "Whether the rows are matched on it now.",
            "title": "Current",
            "type": "boolean"
          },
          "editable": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True when people can edit this field in the tool, so an edited record comes back as a new row; false when the tool sets it and it never changes; null when the tool does not say.",
            "title": "Editable"
          },
          "field": {
            "description": "The key, as the tool names it. Send it as identity_field.",
            "title": "Field",
            "type": "string"
          },
          "filled": {
            "description": "How many sampled records carry a value for it.",
            "title": "Filled",
            "type": "integer"
          },
          "label": {
            "description": "The key's name for a person to read, e.g. 'Record ID'.",
            "title": "Label",
            "type": "string"
          },
          "problem": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IdentityFieldProblem"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the table cannot switch to it: `missing` (some records or rows have no value), `shared` (two hold the same one) or `inexact` (the rows store it in a form a refresh cannot match exactly). Null when it can."
          },
          "recommended": {
            "description": "Whether it is the key a new import from this tool would pick.",
            "title": "Recommended",
            "type": "boolean"
          },
          "rows": {
            "description": "Rows in the table that came from the tool.",
            "title": "Rows",
            "type": "integer"
          },
          "rows_missing": {
            "description": "Of those, rows whose stored record has no value for it.",
            "title": "Rows Missing",
            "type": "integer"
          },
          "rows_shared": {
            "description": "Of those, rows whose value another row also has.",
            "title": "Rows Shared",
            "type": "integer"
          },
          "sampled": {
            "description": "How many of the tool's records were just sampled.",
            "title": "Sampled",
            "type": "integer"
          },
          "unique": {
            "description": "Whether no two different sampled records share a value.",
            "title": "Unique",
            "type": "boolean"
          }
        },
        "required": [
          "field",
          "label",
          "current",
          "recommended",
          "sampled",
          "filled",
          "unique",
          "editable",
          "rows",
          "rows_missing",
          "rows_shared",
          "available",
          "problem"
        ],
        "title": "SourceIdentityOptionSchema",
        "type": "object"
      },
      "SpamCheckRequestSchema": {
        "description": "The drafted text to analyse: pure text in, findings out.",
        "properties": {
          "body": {
            "default": "",
            "maxLength": 100000,
            "title": "Body",
            "type": "string"
          },
          "opens_thread": {
            "default": true,
            "description": "Whether the email starts a thread of its own. A first email is held to a cold email's length, 25 to 200 words; a reply in a thread may be short. Read for an email only.",
            "title": "Opens Thread",
            "type": "boolean"
          },
          "scope": {
            "$ref": "#/components/schemas/SpamCheckScope",
            "default": "email",
            "description": "What the text is. A signature skips the length rules, which only make sense about a whole email."
          },
          "subject": {
            "default": "",
            "maxLength": 1000,
            "title": "Subject",
            "type": "string"
          }
        },
        "title": "SpamCheckRequestSchema",
        "type": "object"
      },
      "SpamCheckResponseSchema": {
        "properties": {
          "findings": {
            "items": {
              "$ref": "#/components/schemas/SpamFindingReadSchema"
            },
            "title": "Findings",
            "type": "array"
          },
          "passes": {
            "description": "What an email passes, each with its value: \"2 variables\", \"75 words\", \"No links\", \"1 emoji\". Empty for a signature, and for an email with nothing in it yet.",
            "items": {
              "type": "string"
            },
            "title": "Passes",
            "type": "array"
          }
        },
        "required": [
          "findings"
        ],
        "title": "SpamCheckResponseSchema",
        "type": "object"
      },
      "SpamCheckScope": {
        "description": "What kind of text the deliverability check is reading.\n\nThe rules are not all portable. Length is the one that isn't: a cold email\nunder eight words really is a filter pattern, and a signature is ALWAYS\nunder eight words (a name and a role is four). Run the email rules over a\nsignature and every sender is told to pad theirs into \"a sentence of\nsubstance\", directly contradicting the guidance printed above the box that\ntells them to keep it to a name, a role, and one link.\n\nEverything else (trigger phrases, link density, shouting, punctuation)\nmeans the same thing wherever the text ends up, and runs for both.",
        "enum": [
          "email",
          "signature"
        ],
        "title": "SpamCheckScope",
        "type": "string"
      },
      "SpamFindingReadSchema": {
        "properties": {
          "code": {
            "title": "Code",
            "type": "string"
          },
          "detail": {
            "description": "The evidence: \"3 in the message. One is safest, two at most.\"",
            "title": "Detail",
            "type": "string"
          },
          "excerpt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Excerpt"
          },
          "excerpts": {
            "description": "Every piece of text the finding is about; excerpt is the first.",
            "items": {
              "type": "string"
            },
            "title": "Excerpts",
            "type": "array"
          },
          "message": {
            "description": "Title and detail as one sentence, for a single line.",
            "title": "Message",
            "type": "string"
          },
          "severity": {
            "description": "warning (likely hurts) or info (worth knowing).",
            "title": "Severity",
            "type": "string"
          },
          "title": {
            "description": "The problem, named: \"Too many links\".",
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "code",
          "severity",
          "title",
          "detail",
          "message"
        ],
        "title": "SpamFindingReadSchema",
        "type": "object"
      },
      "StartSubdomainSearchRequestSchema": {
        "description": "Start a search for one domain's subdomains.",
        "properties": {
          "domain": {
            "description": "The domain to search, e.g. slack.com. A pasted URL is trimmed.",
            "maxLength": 512,
            "minLength": 1,
            "title": "Domain",
            "type": "string"
          }
        },
        "required": [
          "domain"
        ],
        "title": "StartSubdomainSearchRequestSchema",
        "type": "object"
      },
      "StartupLaunchBatchReadSchema": {
        "description": "One accelerator batch the crawled listings name.",
        "properties": {
          "name": {
            "description": "What to send back in `batches`, such as \"Winter 2026\".",
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "title": "StartupLaunchBatchReadSchema",
        "type": "object"
      },
      "StartupLaunchChoiceSchema": {
        "description": "One value a startup launch filter offers.",
        "properties": {
          "key": {
            "description": "What to send back in the filter.",
            "title": "Key",
            "type": "string"
          },
          "label": {
            "description": "What to call it on screen.",
            "title": "Label",
            "type": "string"
          }
        },
        "required": [
          "key",
          "label"
        ],
        "title": "StartupLaunchChoiceSchema",
        "type": "object"
      },
      "StartupLaunchFilterReadSchema": {
        "description": "One filter of a startup launch search, and the boards it applies to.",
        "properties": {
          "choices": {
            "description": "The values a list filter offers, in order; empty for the rest.",
            "items": {
              "$ref": "#/components/schemas/StartupLaunchChoiceSchema"
            },
            "title": "Choices",
            "type": "array"
          },
          "field": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ListingField"
              },
              {
                "type": "null"
              }
            ],
            "description": "The fact only some boards carry that the filter reads; null for a filter every board answers."
          },
          "filter": {
            "description": "The filter's field in a startup launch search.",
            "title": "Filter",
            "type": "string"
          },
          "narrows": {
            "description": "Whether setting the filter keeps only the listings of `sources`, so a screen can say \"Only Y Combinator\" beside it. False for a filter every board answers, and for one that only leaves out what its boards mark (`exclude_promoted`), which keeps every other board's listings.",
            "title": "Narrows",
            "type": "boolean"
          },
          "sources": {
            "description": "The boards the filter applies to: every board when `field` is null, otherwise the boards whose listings carry `field`.",
            "items": {
              "$ref": "#/components/schemas/LaunchSource"
            },
            "title": "Sources",
            "type": "array"
          }
        },
        "required": [
          "filter",
          "field",
          "sources",
          "narrows",
          "choices"
        ],
        "title": "StartupLaunchFilterReadSchema",
        "type": "object"
      },
      "StartupLaunchSourceReadSchema": {
        "description": "One board a startup launch search reads, as our crawl holds it.",
        "properties": {
          "coverage_start": {
            "description": "The first day the board's listings are complete from. A search reaching back before it finds fewer of that board's listings.",
            "format": "date",
            "title": "Coverage Start",
            "type": "string"
          },
          "display_name": {
            "description": "What to call the board on screen.",
            "title": "Display Name",
            "type": "string"
          },
          "fields": {
            "description": "The facts only some boards carry that this board's listings can carry. A filter or a column on one of them applies to this board.",
            "items": {
              "$ref": "#/components/schemas/ListingField"
            },
            "title": "Fields",
            "type": "array"
          },
          "home_url": {
            "description": "The board's own site.",
            "title": "Home Url",
            "type": "string"
          },
          "key": {
            "$ref": "#/components/schemas/LaunchSource",
            "description": "What to send back in `sources`."
          },
          "listings": {
            "description": "How many of the board's listings we hold.",
            "title": "Listings",
            "type": "integer"
          },
          "newest_listed_on": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The newest day a listing we hold was listed on; null before the first crawl.",
            "title": "Newest Listed On"
          },
          "updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a crawl last read the board; null before the first.",
            "title": "Updated At"
          }
        },
        "required": [
          "key",
          "display_name",
          "home_url",
          "coverage_start",
          "fields",
          "listings",
          "newest_listed_on",
          "updated_at"
        ],
        "title": "StartupLaunchSourceReadSchema",
        "type": "object"
      },
      "StartupLaunchesQuerySchema": {
        "description": "Filters for a search of the companies listed on startup launch boards.\n\nOne row per company, newest listing first, however many boards list it.\nEvery filter narrows; a filter on a fact only some boards carry keeps only\nthe listings of the boards that carry it.",
        "properties": {
          "batches": {
            "description": "Only companies from any of these accelerator batches, spelled as `GET /leads/startup-launches/batches/` lists them (\"Winter 2026\"). Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "items": {
              "maxLength": 40,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 50,
            "title": "Batches",
            "type": "array"
          },
          "categories": {
            "description": "Only companies in any of these categories. Every board's own tags are sorted into these.",
            "items": {
              "$ref": "#/components/schemas/LaunchCategory"
            },
            "maxItems": 50,
            "title": "Categories",
            "type": "array"
          },
          "company_statuses": {
            "description": "Only companies with any of these statuses. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "items": {
              "$ref": "#/components/schemas/CompanyStatus"
            },
            "maxItems": 50,
            "title": "Company Statuses",
            "type": "array"
          },
          "countries": {
            "description": "Only companies based in any of these countries, each a two-letter code such as US or GB. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "items": {
              "maxLength": 16,
              "type": "string"
            },
            "maxItems": 50,
            "title": "Countries",
            "type": "array"
          },
          "cross_listed": {
            "default": false,
            "description": "Only companies listed on two boards or more.",
            "title": "Cross Listed",
            "type": "boolean"
          },
          "exclude_promoted": {
            "default": false,
            "description": "Leave out listings the board marks as paid placements. Only some boards mark them, and every other board's listings stay in.",
            "title": "Exclude Promoted",
            "type": "boolean"
          },
          "for_sale": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True for only companies listed for sale, false for only those that are not. Leave it out for both. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "For Sale"
          },
          "has_maker_linkedin": {
            "default": false,
            "description": "Only companies with a maker whose LinkedIn profile is known. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Has Maker Linkedin",
            "type": "boolean"
          },
          "has_maker_x": {
            "default": false,
            "description": "Only companies with a maker whose X profile is known. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Has Maker X",
            "type": "boolean"
          },
          "has_website": {
            "default": true,
            "description": "Only companies with a website of their own, not a GitHub, App Store or board page. On by default.",
            "title": "Has Website",
            "type": "boolean"
          },
          "hiring": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True for only companies hiring now, false for only those that are not. Leave it out for both. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Hiring"
          },
          "keywords": {
            "anyOf": [
              {
                "maxLength": 200,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Words to find in the name, tagline and description, written the way you would search the web: \"exact phrase\", OR between words, and -word to leave a word out.",
            "title": "Keywords"
          },
          "listed_from": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies listed on or after this day, as YYYY-MM-DD: the day a board listed them, not the day they launched.",
            "title": "Listed From"
          },
          "listed_to": {
            "anyOf": [
              {
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies listed on or before this day, as YYYY-MM-DD.",
            "title": "Listed To"
          },
          "listed_within_days": {
            "anyOf": [
              {
                "maximum": 3650.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies listed in this many days back from the day the search runs: 30 is the past 30 days. A saved or scheduled search keeps reading the newest days. Send it instead of listed_from and listed_to, not with them.",
            "title": "Listed Within Days"
          },
          "min_comments": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only listings with at least this many comments. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Min Comments"
          },
          "min_votes": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only listings with at least this many votes. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Min Votes"
          },
          "open_source": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "True for only open-source products, false for only those that are not. Leave it out for both. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Open Source"
          },
          "post_kinds": {
            "description": "Only listings from any of these kinds of post. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "items": {
              "$ref": "#/components/schemas/PostKind"
            },
            "maxItems": 50,
            "title": "Post Kinds",
            "type": "array"
          },
          "pricing": {
            "description": "Only products priced in any of these ways. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "items": {
              "$ref": "#/components/schemas/PricingModel"
            },
            "maxItems": 50,
            "title": "Pricing",
            "type": "array"
          },
          "revenue_max_usd": {
            "anyOf": [
              {
                "maximum": 1000000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies making at most this much a month, in US dollars (MRR). Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Revenue Max Usd"
          },
          "revenue_min_usd": {
            "anyOf": [
              {
                "maximum": 1000000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies making at least this much a month, in US dollars (MRR). Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Revenue Min Usd"
          },
          "sources": {
            "description": "The boards to search, as `GET /leads/startup-launches/sources/` lists them. Empty searches every board.",
            "items": {
              "$ref": "#/components/schemas/LaunchSource"
            },
            "maxItems": 50,
            "title": "Sources",
            "type": "array"
          },
          "team_size_max": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies with at most this many people. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Team Size Max"
          },
          "team_size_min": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Only companies with at least this many people. Only some boards carry this, and setting it keeps only their listings: `GET /leads/startup-launches/filters/` names them. Filters whose boards share none are refused, since no listing could match them all.",
            "title": "Team Size Min"
          }
        },
        "title": "StartupLaunchesQuerySchema",
        "type": "object"
      },
      "StepAuthoring": {
        "description": "Who writes an email step's words.\n\nWRITTEN is the default and what every step was before: the author's own\nsubject and body, with variables, snippets and spintax resolved per\ncontact. AGENT holds an instruction instead of a body; the whole email is\nwritten for each contact at send time from that instruction, the row and\nthe workspace's written business context, and priced per contact.",
        "enum": [
          "written",
          "agent"
        ],
        "title": "StepAuthoring",
        "type": "string"
      },
      "StepHold": {
        "description": "Why a sequence's step may not run now, whatever its approval says.\n\nA paused sequence or a paused contact sends nothing on either channel; an\napproval given meanwhile waits for **Resume sequence** (or the contact's\nown resume).",
        "enum": [
          "sequence_paused",
          "contact_paused"
        ],
        "title": "StepHold",
        "type": "string"
      },
      "StepHoldReadSchema": {
        "description": "The worst reason holding contacts on one step, for the step's card.",
        "properties": {
          "contacts": {
            "title": "Contacts",
            "type": "integer"
          },
          "reason": {
            "$ref": "#/components/schemas/SequenceHold"
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          }
        },
        "required": [
          "step_id",
          "reason",
          "contacts"
        ],
        "title": "StepHoldReadSchema",
        "type": "object"
      },
      "StepLooksGoodReadSchema": {
        "description": "The Builder's Looks good on one email, and the learning its Needs work proposed, saved.",
        "properties": {
          "agent_written": {
            "default": false,
            "description": "The agent wrote this for the contact. A preview is one draft; the real send is written fresh, unless `approved`.",
            "title": "Agent Written",
            "type": "boolean"
          },
          "approved": {
            "default": false,
            "description": "The words were marked Looks good, with the contact's thread on the AI writing tab or as this one email from the Builder, and still stand, so they are what sends. They stop standing, and the agent writes the step fresh, once the agent's writing or the contact's row changes.",
            "title": "Approved",
            "type": "boolean"
          },
          "body": {
            "title": "Body",
            "type": "string"
          },
          "closing": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EmailClosingReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the send adds below these words, the sender's signature and then the opt-out footer, one blank line apart, so the email can be shown whole as the contact will get it. Set by the preview routes on an email step."
          },
          "in_thread": {
            "title": "In Thread",
            "type": "boolean"
          },
          "is_sample": {
            "default": false,
            "title": "Is Sample",
            "type": "boolean"
          },
          "message_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's message these words are, on an agent-written step: the sample on screen, or the one marked Looks good. Marking it Looks good (`PUT /sequences/{sequence_id}/steps/{step_id}/rows/{record_id}/feedback/`) takes it back as `message_id`, so a mark lands only on the words that were read.",
            "title": "Message Id"
          },
          "missing_columns": {
            "items": {
              "type": "string"
            },
            "title": "Missing Columns",
            "type": "array"
          },
          "pinned": {
            "default": false,
            "description": "The words are pinned for this contact by a person (their own edit) or by the approval queue, and send exactly as they are. A thread marked Looks good is `approved` instead.",
            "title": "Pinned",
            "type": "boolean"
          },
          "preview_units": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "With `written` false: how much of today's preview allowance writing it would use, one for each message the agent writes in the call (the contact's whole sequence for a contact not written to yet). Writing is refused when `GET /outbound-agents/preview-allowance/` has fewer `remaining`. Null otherwise, or when it cannot be worked out.",
            "title": "Preview Units"
          },
          "sample_created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sample Created At"
          },
          "sample_version": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sample Version"
          },
          "saved_learnings": {
            "description": "How many changes to the agent's learnings this Looks good saved: those a Needs work on the contact proposed and wrote the thread again with. 0 when none waited, or when the list a change joins is full, so it stays proposed while the email is still marked.",
            "title": "Saved Learnings",
            "type": "integer"
          },
          "saved_learnings_for_all_sequences": {
            "description": "Of saved_learnings, how many apply to every sequence, not only this one.",
            "title": "Saved Learnings For All Sequences",
            "type": "integer"
          },
          "sent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SentStepEmailReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The email this step already got out to this contact, as it went, when one did: what they received, whoever wrote it, rather than the words above. Set by the preview and samples routes; null when the step has not reached them."
          },
          "spam_findings": {
            "description": "The spam check and the placeholder scan, run on the agent's words for this contact. Always empty for a written step, whose text the composer's own check covers. Advice, never a refusal.",
            "items": {
              "$ref": "#/components/schemas/SpamFindingReadSchema"
            },
            "title": "Spam Findings",
            "type": "array"
          },
          "subject": {
            "title": "Subject",
            "type": "string"
          },
          "waiting_for_approval": {
            "default": false,
            "description": "This contact's message at this step waits for a person's approval on its Tasks card, where its words are changed, approved or rejected. Set by the preview and samples routes; false once the card is decided, or when the step never asked.",
            "title": "Waiting For Approval",
            "type": "boolean"
          },
          "written": {
            "default": true,
            "description": "False only when nothing is written for this contact at this step yet, which the step's preview shows rather than writes: subject and body are empty. `POST /sequences/{sequence_id}/steps/{step_id}/rows/{record_id}/samples/` has the agent write it.",
            "title": "Written",
            "type": "boolean"
          }
        },
        "required": [
          "subject",
          "body",
          "missing_columns",
          "in_thread",
          "saved_learnings",
          "saved_learnings_for_all_sequences"
        ],
        "title": "StepLooksGoodReadSchema",
        "type": "object"
      },
      "StepPerformanceReadSchema": {
        "description": "One non-condition step's outcomes. Null = honestly unknowable.",
        "properties": {
          "bounces": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Bounces"
          },
          "charged_credits": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a Browser use step's runs were charged, in credits. Null elsewhere.",
            "title": "Charged Credits"
          },
          "kind": {
            "title": "Kind",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "needs_human": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Of a Browser use step's runs, those that ended on Needs human; else null.",
            "title": "Needs Human"
          },
          "position": {
            "title": "Position",
            "type": "integer"
          },
          "replies": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Replies"
          },
          "runs": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "A Browser use step's runs that ended on an outcome. It sends nothing, so this is its count in place of sent. Null on every other step.",
            "title": "Runs"
          },
          "sent": {
            "description": "Accepted sends or succeeded LinkedIn actions; 0 on a Browser use step.",
            "title": "Sent",
            "type": "integer"
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Type"
          }
        },
        "required": [
          "step_id",
          "position",
          "kind",
          "name",
          "type",
          "sent",
          "replies",
          "bounces"
        ],
        "title": "StepPerformanceReadSchema",
        "type": "object"
      },
      "StepRef": {
        "description": "A parameter that reads an EARLIER step's output in the same chain.\n\nWithout this a chain could fork but never join. ``source_step`` already let\na unary step read back to an earlier result, but the only functions that\ntake several inputs at once (``concatenate`` and ``format``) could name\ncolumns and literals and nothing else. So \"upper-case the initial of one\ncolumn, do the same to another, then put the two together\" had no\nexpression: the two halves could be computed but never combined, and the\nauthor had to invert the whole formula into combine-first-then-extract.\n\nReading a step that is not strictly earlier has no value to read, so\n``chain_refs.validate_step_references`` rejects it at save time rather than\nletting the engine quietly substitute something else.",
        "properties": {
          "ref": {
            "const": "step",
            "default": "step",
            "title": "Ref",
            "type": "string"
          },
          "step": {
            "description": "1-based position of the step to read.",
            "minimum": 1.0,
            "title": "Step",
            "type": "integer"
          }
        },
        "required": [
          "step"
        ],
        "title": "StepRef",
        "type": "object"
      },
      "StepSkipReason": {
        "description": "Why the engine passed a step without doing it, for a contact that step cannot reach.\n\nKept on the skip ledger at the moment of the skip, because nothing else\nremembers it: the engine moves the contact on, and the status cell the\nskip wrote is rewritten by the next step's line. The first two are an\nemail step's reasons, the rest a LinkedIn step's. A step the browser\nskipped is not here: its LinkedIn action keeps that ending itself.",
        "enum": [
          "no_email",
          "email_verdict",
          "no_linkedin_url",
          "own_profile",
          "profile_not_resolved",
          "nothing_to_withdraw"
        ],
        "title": "StepSkipReason",
        "type": "string"
      },
      "StepWordsReadSchema": {
        "description": "One email or message of a Preview contact's thread, as it read before a Needs work.",
        "properties": {
          "body": {
            "description": "The words.",
            "title": "Body",
            "type": "string"
          },
          "step_id": {
            "description": "The sequence step it was written for.",
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The subject line; null for LinkedIn.",
            "title": "Subject"
          }
        },
        "required": [
          "step_id",
          "subject",
          "body"
        ],
        "title": "StepWordsReadSchema",
        "type": "object"
      },
      "StopReason": {
        "enum": [
          "reply",
          "unsubscribe",
          "bounce",
          "manual",
          "company_reply",
          "row_left_audience",
          "row_left_paused",
          "step_removed",
          "removed",
          "cooldown",
          "rejected",
          "mailbox_removed",
          "unread_reply",
          "declined",
          "trashed",
          "trashed_paused"
        ],
        "title": "StopReason",
        "type": "string"
      },
      "StopRequestUndoneSchema": {
        "description": "What Undo on a stop request came to.",
        "properties": {
          "restored": {
            "description": "Sequence rows put back as they stood before the stop request: most often the reply's own stop, which Resume undoes.",
            "title": "Restored",
            "type": "integer"
          },
          "still_blocked": {
            "description": "Something else keeps the contact on do-not-contact (an entry a person added, an unsubscribe, their domain), so their sequences stay stopped for good.",
            "title": "Still Blocked",
            "type": "boolean"
          },
          "unblocked": {
            "description": "The address came off do-not-contact.",
            "title": "Unblocked",
            "type": "boolean"
          }
        },
        "required": [
          "unblocked",
          "still_blocked",
          "restored"
        ],
        "title": "StopRequestUndoneSchema",
        "type": "object"
      },
      "SubdomainFeedRefreshSchema": {
        "description": "One read a table made of its domain, to add the subdomains it did not have.",
        "properties": {
          "created_at": {
            "description": "When the read started.",
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Code"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "new_hostnames": {
            "description": "Hostnames this read found that the table never had a row for. Larger than rows_created when the plan's rows per table left no room for some; a later check offers those again once there is room.",
            "title": "New Hostnames",
            "type": "integer"
          },
          "retryable": {
            "description": "Whether trying again could plausibly work.",
            "title": "Retryable",
            "type": "boolean"
          },
          "rows_created": {
            "description": "Rows this read added to the table.",
            "title": "Rows Created",
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/SubdomainSearchStatus",
            "description": "Succeeded once its new rows are in the table. Pending or running while `checking` is false means it stopped answering and added nothing."
          },
          "trigger": {
            "$ref": "#/components/schemas/SubdomainSearchTrigger",
            "description": "Who asked: refresh is a person, schedule is the table's refresh schedule."
          },
          "updated_at": {
            "description": "When the read last changed: when it ended, once ended.",
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "trigger",
          "status",
          "new_hostnames",
          "rows_created",
          "error",
          "error_code",
          "retryable",
          "created_at",
          "updated_at"
        ],
        "title": "SubdomainFeedRefreshSchema",
        "type": "object"
      },
      "SubdomainFeedSchema": {
        "description": "A table made from a subdomain search, which reads its domain again to add new subdomains.",
        "properties": {
          "checking": {
            "description": "Whether a check for new subdomains is under way now: from the moment it starts until its new rows are in the table.",
            "title": "Checking",
            "type": "boolean"
          },
          "domain": {
            "description": "The domain the table reads.",
            "title": "Domain",
            "type": "string"
          },
          "last_read_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the newest successful read started: a refresh, or the search the table was made from.",
            "title": "Last Read At"
          },
          "last_refresh": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SubdomainFeedRefreshSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The newest read the table made, in any state; null until it refreshes once."
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "domain",
          "last_refresh",
          "last_read_at",
          "checking"
        ],
        "title": "SubdomainFeedSchema",
        "type": "object"
      },
      "SubdomainSearchResponseSchema": {
        "description": "One search and whatever it has found so far.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "domain": {
            "title": "Domain",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Code"
          },
          "hostnames": {
            "description": "Discovered hostnames, newest first sighting first. Empty until the search succeeds. At most the per-search cap (5,000 by default): a larger domain is trimmed to its newest names and partial is true.",
            "items": {
              "type": "string"
            },
            "title": "Hostnames",
            "type": "array"
          },
          "hostnames_found": {
            "description": "How many distinct hostnames the search found, before the per-search cap. Larger than len(hostnames) when the cap trimmed the list; use this for the headline count.",
            "title": "Hostnames Found",
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "partial": {
            "description": "True when hostnames is a slice of what was found, which is when hostnames_found exceeds len(hostnames). The names kept are the newest first sightings.",
            "title": "Partial",
            "type": "boolean"
          },
          "retryable": {
            "description": "Whether running the same search again could plausibly work.",
            "title": "Retryable",
            "type": "boolean"
          },
          "rows_created": {
            "title": "Rows Created",
            "type": "integer"
          },
          "rows_to_add": {
            "description": "How many rows turning this search into a table would add: the hostnames stored, cut to the plan's rows per table. Put it on the create button; 0 until the search succeeds.",
            "title": "Rows To Add",
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/SubdomainSearchStatus"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Table Id"
          }
        },
        "required": [
          "id",
          "domain",
          "status",
          "hostnames",
          "hostnames_found",
          "partial",
          "rows_to_add",
          "table_id",
          "rows_created",
          "error",
          "error_code",
          "retryable",
          "created_at"
        ],
        "title": "SubdomainSearchResponseSchema",
        "type": "object"
      },
      "SubdomainSearchStatus": {
        "description": "Where one subdomain search has got to.",
        "enum": [
          "pending",
          "running",
          "succeeded",
          "failed"
        ],
        "title": "SubdomainSearchStatus",
        "type": "string"
      },
      "SubdomainSearchTrigger": {
        "description": "Why a search ran: somebody searched, or a table it fills read its domain again.\n\nA table made from a search is a feed: every later read of the same domain\nis a search of its own, attached to the table from the start, and lands\nonly the hostnames the table has never had a row for.",
        "enum": [
          "search",
          "refresh",
          "schedule"
        ],
        "title": "SubdomainSearchTrigger",
        "type": "string"
      },
      "SubscriptionReadSchema": {
        "description": "Response schema for subscription information.",
        "properties": {
          "billing_email": {
            "anyOf": [
              {
                "format": "email",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The billing email address for invoices and billing alerts. ",
            "title": "Billing Email"
          },
          "billing_interval": {
            "anyOf": [
              {
                "enum": [
                  "month",
                  "year"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The billing interval of the subscription. None for free plans.",
            "title": "Billing Interval"
          },
          "cancel_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The date when the subscription is scheduled to be canceled. If set, the subscription will be canceled at this time. None if the subscription is not scheduled for cancellation.",
            "title": "Cancel At"
          },
          "credit_quantity": {
            "description": "The monthly credit allowance the subscription's own price grants.",
            "title": "Credit Quantity",
            "type": "integer"
          },
          "credit_tier_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The selected credit volume (e.g. 'team_tier_20k'). None for free plans.",
            "title": "Credit Tier Key"
          },
          "current_period_end": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The end of the current Stripe billing period. None for free plans: credit period truth lives on the credit balance.",
            "title": "Current Period End"
          },
          "current_period_start": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The start of the current Stripe billing period. None for free plans: credit period truth lives on the credit balance.",
            "title": "Current Period Start"
          },
          "current_price_decimal": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the subscription actually costs per `billing_interval` unit, in cents, read off its own Stripe price. None for free plans. Prefer this over recomputing from the catalog: it stays right for a grandfathered price or a volume the catalog has since retired.",
            "title": "Current Price Decimal"
          },
          "data_retention": {
            "description": "Data retention period.",
            "format": "duration",
            "title": "Data Retention",
            "type": "string"
          },
          "included_credits": {
            "description": "Credits granted each period (the period allowance).",
            "title": "Included Credits",
            "type": "integer"
          },
          "is_product_limited": {
            "description": "Whether the product is currently limited due to usage or payment issues. \nWhen True, the organization cannot perform billable actions. \nThis happens in two scenarios: \n1. The credit balance is exhausted. \n2. The subscription status is UNPAID (payment failed or cancelled). \n",
            "title": "Is Product Limited",
            "type": "boolean"
          },
          "max_integrations": {
            "description": "Maximum number of integrations allowed. 0 means unlimited.",
            "title": "Max Integrations",
            "type": "integer"
          },
          "max_rows_per_table": {
            "description": "Maximum number of rows per table. 0 means unlimited.",
            "title": "Max Rows Per Table",
            "type": "integer"
          },
          "max_tables": {
            "description": "Maximum number of tables allowed. 0 means unlimited.",
            "title": "Max Tables",
            "type": "integer"
          },
          "payment_method": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PaymentMethodReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The default payment card summary. None when no card is on file."
          },
          "product_name": {
            "description": "The product name for the subscription.",
            "title": "Product Name",
            "type": "string"
          },
          "product_type": {
            "$ref": "#/components/schemas/ProductTier",
            "description": "The product name for the subscription."
          },
          "seats": {
            "description": "Number of seats included. 0 means unlimited.",
            "title": "Seats",
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/SubscriptionStatus",
            "description": "The subscription status. \n- active: User has active product with no past due fees. \n  - Product remains active with full functionality. \n- incomplete_payment: The first payment failed or is processing. \n  - Product remains active with full functionality. \n  - User action is required to activate. Otherwise the product will become UNPAID. \n- past_due: The subscription fees aren't paid. Stripe will retry to collect the payment. \n  - Product remains active with full functionality. \n  - No user action is needed yet. However a user can proactively solve the issue. \n- unpaid: The subscription fees aren't paid. Stripe will no longer try to collect the payment. \n  - Product is not functional anymore. \n  - Needs user action to activate. \n"
          }
        },
        "required": [
          "product_name",
          "product_type",
          "status",
          "current_period_start",
          "current_period_end",
          "billing_interval",
          "credit_tier_key",
          "current_price_decimal",
          "credit_quantity",
          "payment_method",
          "billing_email",
          "is_product_limited",
          "max_integrations",
          "included_credits",
          "max_tables",
          "max_rows_per_table",
          "data_retention",
          "seats"
        ],
        "title": "SubscriptionReadSchema",
        "type": "object"
      },
      "SubscriptionStatus": {
        "description": "The status of a subscription for an organization.\n\nActive is the good state for all types of products. All other states are transitional states.\n\nWhen a subscription is cancelled, it becomes Free plan. We treat cancelled Stripe subscriptions\nas non-existent. Customer won't see any cancelled subscriptions on billing portal.\n\nThere is a long transition from:\nActive -> Past Due -> Unpaid -> Free",
        "enum": [
          "active",
          "incomplete_payment",
          "past_due",
          "unpaid"
        ],
        "title": "SubscriptionStatus",
        "type": "string"
      },
      "SuccessfullyDeletedResponse": {
        "properties": {
          "count": {
            "default": 1,
            "description": "The number of resources that were deleted.",
            "title": "Count",
            "type": "integer"
          },
          "detail": {
            "description": "The detail of why the resource was deleted.",
            "title": "Detail",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "title": "SuccessfullyDeletedResponse",
        "type": "object"
      },
      "SuggestedIntegrationNameSchema": {
        "description": "Response model for Suggest Integration Name endpoint.",
        "properties": {
          "suggested_name": {
            "description": "The suggested unique integration name.",
            "title": "Suggested Name",
            "type": "string"
          }
        },
        "required": [
          "suggested_name"
        ],
        "title": "SuggestedIntegrationNameSchema",
        "type": "object"
      },
      "SuggestedLeadTableNameSchema": {
        "description": "The name a table would take from the search that fills it.",
        "properties": {
          "suggested_name": {
            "description": "The search's most telling filters, joined with commas, or what its rows are and today's date when it has none.",
            "title": "Suggested Name",
            "type": "string"
          }
        },
        "required": [
          "suggested_name"
        ],
        "title": "SuggestedLeadTableNameSchema",
        "type": "object"
      },
      "SuppressionAddSchema": {
        "properties": {
          "values": {
            "description": "Addresses and domains, one per item. A value containing @ suppresses one address; a bare domain suppresses everyone at it.",
            "items": {
              "maxLength": 320,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 10000,
            "minItems": 1,
            "title": "Values",
            "type": "array"
          }
        },
        "required": [
          "values"
        ],
        "title": "SuppressionAddSchema",
        "type": "object"
      },
      "SuppressionBulkCreateResponseSchema": {
        "properties": {
          "data": {
            "description": "The entries that were new, in the order given.",
            "items": {
              "$ref": "#/components/schemas/SuppressionEntryReadSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "rejected": {
            "description": "Inputs that could not be parsed.",
            "items": {
              "type": "string"
            },
            "title": "Rejected",
            "type": "array"
          }
        },
        "required": [
          "data",
          "rejected"
        ],
        "title": "SuppressionBulkCreateResponseSchema",
        "type": "object"
      },
      "SuppressionCountSchema": {
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "SuppressionCountSchema",
        "type": "object"
      },
      "SuppressionEntryReadSchema": {
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/SuppressionKind"
          },
          "source": {
            "$ref": "#/components/schemas/SuppressionSource"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "id",
          "kind",
          "value",
          "source",
          "created_at"
        ],
        "title": "SuppressionEntryReadSchema",
        "type": "object"
      },
      "SuppressionKind": {
        "description": "Whether an entry blocks one address or a whole domain.",
        "enum": [
          "email",
          "domain"
        ],
        "title": "SuppressionKind",
        "type": "string"
      },
      "SuppressionSource": {
        "description": "How an entry got onto the list, kept for audit and for the UI's story.",
        "enum": [
          "manual",
          "opt_out_reply",
          "reply_stop",
          "inbox_action",
          "opt_out_link",
          "hard_bounce"
        ],
        "title": "SuppressionSource",
        "type": "string"
      },
      "SwitchIntent": {
        "description": "Why an OAuth grant is being captured against an *existing* integration.\n\nSet on an installation whose grant re-authorizes a connection in place rather than creating a\nnew one. ``None`` on a normal new-connect install.",
        "enum": [
          "switch",
          "reconnect"
        ],
        "title": "SwitchIntent",
        "type": "string"
      },
      "SwitchPlanRedirectResponseSchema": {
        "description": "Where to send the customer to complete the plan change.\n\nThere is no \"completed\" case: Stripe confirms every plan change, so this\nalways carries a URL to leave for, except on a dry run.",
        "properties": {
          "redirect_url": {
            "anyOf": [
              {
                "format": "uri",
                "maxLength": 2083,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The URL to redirect the customer to. Null on a dry run, which opens no Stripe page: `type` still says which one the real call would open.",
            "title": "Redirect Url"
          },
          "type": {
            "description": "Which Stripe surface completes the change: 'checkout' for a first paid subscription, 'portal' for a change to an existing one.",
            "enum": [
              "checkout",
              "portal"
            ],
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "type",
          "redirect_url"
        ],
        "title": "SwitchPlanRedirectResponseSchema",
        "type": "object"
      },
      "SwitchPlanRequestSchema": {
        "description": "Request schema for switching subscription plan.",
        "properties": {
          "billing_interval": {
            "default": "month",
            "description": "The billing interval to subscribe with.",
            "enum": [
              "month",
              "year"
            ],
            "title": "Billing Interval",
            "type": "string"
          },
          "cancel_path": {
            "description": "Partial path (e.g. /billing/plans) of where the stripe Checkout session should redirect the user if payment is cancelled.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Cancel Path",
            "type": "string"
          },
          "credit_tier_key": {
            "anyOf": [
              {
                "maxLength": 50,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The credit tier to subscribe to (e.g. 'tier_20k'). Required for products with selectable credit tiers (the Team plan).",
            "title": "Credit Tier Key"
          },
          "new_product": {
            "$ref": "#/components/schemas/ProductTier",
            "description": "The new product to switch to."
          },
          "success_path": {
            "description": "Partial path (e.g. /billing/complete) of where the stripe Checkout session should redirect the user if payment is successful.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Success Path",
            "type": "string"
          }
        },
        "required": [
          "success_path",
          "cancel_path",
          "new_product"
        ],
        "title": "SwitchPlanRequestSchema",
        "type": "object"
      },
      "SyncSequenceResponseSchema": {
        "description": "The manual \"Sync now\" result: what just happened, and when it happened.",
        "properties": {
          "enrolled": {
            "description": "Contacts newly enrolled by this sync run.",
            "title": "Enrolled",
            "type": "integer"
          },
          "last_synced_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the diff completed. None if the sequence has no audience yet.",
            "title": "Last Synced At"
          }
        },
        "required": [
          "enrolled",
          "last_synced_at"
        ],
        "title": "SyncSequenceResponseSchema",
        "type": "object"
      },
      "TableArithmetic-Input": {
        "description": "Apply an arithmetic operator with a constant or column-valued operand.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "arithmetic",
            "default": "arithmetic",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "operand": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Operand"
          },
          "operator": {
            "enum": [
              "add",
              "subtract",
              "multiply",
              "divide"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "operator",
          "operand"
        ],
        "title": "TableArithmetic",
        "type": "object"
      },
      "TableArithmetic-Output": {
        "description": "Apply an arithmetic operator with a constant or column-valued operand.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "arithmetic",
            "default": "arithmetic",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "operand": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Operand"
          },
          "operator": {
            "enum": [
              "add",
              "subtract",
              "multiply",
              "divide"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "operator",
          "operand"
        ],
        "title": "TableArithmetic",
        "type": "object"
      },
      "TableBulkUpdateResponseSchema": {
        "description": "Which tables a bulk change actually changed.",
        "properties": {
          "table_ids": {
            "description": "The tables changed. One already as asked, missing or in Trash is left out.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Table Ids",
            "type": "array"
          },
          "updated": {
            "description": "How many tables changed.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "table_ids"
        ],
        "title": "TableBulkUpdateResponseSchema",
        "type": "object"
      },
      "TableBulkUpdateSchema": {
        "description": "Request body for changing the same fields of several tables at once.",
        "properties": {
          "archived": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "True takes them off the list: out of All, their folder, Favorites and Recent, while search still finds them, they open as before and keep every row. False brings them back, into their folder. Nothing archives a table by itself; only this does.",
            "title": "Archived"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "Put them in this folder; null for the top level of the Tables list. Archived tables move too, and go back to that folder when restored. A table still waiting to be filed after folders replaced tags counts as filed.",
            "title": "Folder Id"
          },
          "ids": {
            "description": "The tables to change. One missing or in Trash is left out.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 500,
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          },
          "owner_user_id": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The workspace member who owns them from now on; null for no owner. Owner means who to ask about a table: it grants and takes away no access, so anyone in the workspace may change it.",
            "title": "Owner User Id"
          }
        },
        "required": [
          "ids"
        ],
        "title": "TableBulkUpdateSchema",
        "type": "object"
      },
      "TableCellActivityEventSchema": {
        "description": "One live agent step for one cell of an active run.\n\nPublished IMMEDIATELY, bypassing the post-commit queue, because steps are\ntelemetry about work that already happened, not table state, and a\ncompute page's transaction spans the whole page. Never coalesced:\nliveness is the point. The transport is lossy by design, so clients treat\nthe post-commit ``rows_changed`` settle as authoritative and use these\nframes for display only.",
        "properties": {
          "attempt": {
            "default": 1,
            "description": "1-based retry attempt; an increment means the investigation restarted, so clear the displayed trail.",
            "title": "Attempt",
            "type": "integer"
          },
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "kind": {
            "const": "cell_activity",
            "default": "cell_activity",
            "title": "Kind",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Run Id"
          },
          "seq": {
            "description": "0-based and strictly rising across the whole cell execution, retries included. The ordering key.",
            "title": "Seq",
            "type": "integer"
          },
          "step": {
            "$ref": "#/components/schemas/TableCellActivityStepSchema"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "record_id",
          "column_id",
          "seq",
          "step"
        ],
        "title": "TableCellActivityEventSchema",
        "type": "object"
      },
      "TableCellActivityStepSchema": {
        "description": "One agent research step, JSON-native.\n\nPlain strings rather than the agent domain's enums: this package sits\nbelow ``table_agent`` and cannot import it, exactly like\n``TableRunRowScopeSchema.kind``. ``action`` values today are ``search`` |\n``map`` | ``scrape`` | ``crawl`` | ``mcp_tool`` | ``finish``; ``outcome``\nvalues are ``completed`` | ``failed`` | ``refused`` | ``stopped``, the\nsame set ``core.ai.AiStep`` spells. Clients must tolerate new tokens.",
        "properties": {
          "action": {
            "title": "Action",
            "type": "string"
          },
          "detail": {
            "description": "The search query, target URL, or tool call: the step's input.",
            "title": "Detail",
            "type": "string"
          },
          "duration_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Duration Ms"
          },
          "observation": {
            "description": "One line on what came back.",
            "title": "Observation",
            "type": "string"
          },
          "outcome": {
            "default": "completed",
            "title": "Outcome",
            "type": "string"
          },
          "thought": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model's stated reasoning for choosing this step.",
            "title": "Thought"
          }
        },
        "required": [
          "action",
          "detail",
          "observation"
        ],
        "title": "TableCellActivityStepSchema",
        "type": "object"
      },
      "TableCellBulkEditItemSchema": {
        "description": "One edit in a bulk cell write; a null value clears the cell.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CellValue-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The new cell value, or null to clear it so the column default renders. A Decimal or Currency value is rounded to the column's decimal places, half away from zero."
          }
        },
        "required": [
          "record_id",
          "column_id"
        ],
        "title": "TableCellBulkEditItemSchema",
        "type": "object"
      },
      "TableCellDeltaSchema": {
        "description": "One cell's post-write state.\n\nDeliberately carries NO ``computing`` flag. That flag is derived\n(``stale`` AND the table has an active run) and a write has no idea whether\na run is active, so carrying it here would flicker cells out of their\ncomputing state mid-run. Clients derive it from their own active-run state,\nexactly as the REST responses do.",
        "properties": {
          "computed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last compute time, for formula cells.",
            "title": "Computed At"
          },
          "confidence": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's own read on its answer, when the action reports one.",
            "title": "Confidence"
          },
          "credits_charged": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Credits the last successful enrichment charged for this cell.",
            "title": "Credits Charged"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Evaluation error, when the cell is in an error state.",
            "title": "Error"
          },
          "error_class": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The failure's taxonomy class, when the cell is errored.",
            "title": "Error Class"
          },
          "manual_override": {
            "default": false,
            "description": "A hand-entered correction runs will not overwrite.",
            "title": "Manual Override",
            "type": "boolean"
          },
          "settled_as": {
            "default": "pending",
            "description": "How the last attempt on this cell ENDED, never what it shows. The grid needs it to tell `no_data` (ran, found nothing) from `pending` (never ran): both render blank and neither carries an error.",
            "enum": [
              "succeeded",
              "no_data",
              "skipped",
              "failed",
              "pending"
            ],
            "title": "Settled As",
            "type": "string"
          },
          "skipped_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why an enrichment run skipped this cell, when it did.",
            "title": "Skipped Reason"
          },
          "stale": {
            "default": false,
            "description": "Whether the value is out of date and awaits a recompute.",
            "title": "Stale",
            "type": "boolean"
          },
          "updated_at": {
            "description": "When this cell was last written.",
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "value": {
            "description": "The cell's value; null renders the column default.",
            "title": "Value"
          },
          "version": {
            "description": "Per-cell watermark; apply only if at least the cached one.",
            "title": "Version",
            "type": "integer"
          },
          "waiting_on": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What a pending cell handed to a sender's LinkedIn browser waits for.",
            "title": "Waiting On"
          }
        },
        "required": [
          "value",
          "error",
          "version",
          "updated_at"
        ],
        "title": "TableCellDeltaSchema",
        "type": "object"
      },
      "TableCellEditRequestSchema": {
        "description": "Request body for setting or clearing one manual cell of the row in the path.",
        "properties": {
          "column_id": {
            "description": "The manual column whose cell to set.",
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CellValue-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The new cell value, coerced to the column's data type, or null to clear the cell so the column's default renders again. A Decimal or Currency value is rounded to the column's decimal places, half away from zero: 2.005 at 2 places is stored as 2.01."
          }
        },
        "required": [
          "column_id",
          "value"
        ],
        "title": "TableCellEditRequestSchema",
        "type": "object"
      },
      "TableCellMutationResponseSchema": {
        "description": "Read-your-writes result of a cell mutation. Never carries a run ID.\n\nWhen ``recomputed_column_ids`` is non-empty the downstream formula values\nare already final in ``cells``; otherwise the recompute run appears on the\nnext active-runs poll. ``stale_column_ids`` is empty on a same-value edit,\nwhich writes nothing. Each returned cell carries its own version, which is\nwhat the client gates its cache on.",
        "properties": {
          "cells": {
            "additionalProperties": {
              "$ref": "#/components/schemas/TableCellSchema"
            },
            "title": "Cells",
            "type": "object"
          },
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "recomputed_column_ids": {
            "description": "Formula columns recomputed INLINE within this request. Their values in `cells` are final and no background run was requested. Empty when a run was queued instead, in which case those cells arrive later.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Recomputed Column Ids",
            "type": "array"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "stale_column_ids": {
            "description": "Transitive formula dependents now marked stale; empty on a same-value edit.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Stale Column Ids",
            "type": "array"
          }
        },
        "required": [
          "record_id",
          "column_id",
          "cells",
          "stale_column_ids"
        ],
        "title": "TableCellMutationResponseSchema",
        "type": "object"
      },
      "TableCellSchema": {
        "description": "One cell of a table row; a column absent from the row's cell map renders blank.\n\n``computing`` is DERIVED, never stored: a cell is computing iff it is stale\nAND some active run has this row in its resolved scope. That second half\nused to reduce to \"any active run exists anywhere in the table\", because a\nrun row published nothing about which rows it would touch; it now consults\nthe scope the mint resolved, so a run over ten rows marks ten rows\ncomputing rather than every stale cell in the table.\n\n``version`` is the cell's own monotonic watermark. It replaced a row-level\ncounter, so two people editing different cells of one row no longer\ninvalidate each other's cached view.",
        "properties": {
          "cancelled": {
            "default": false,
            "description": "A run that owed this cell a recompute was cancelled or paused before reaching it. Cleared by any subsequent write; distinct from never-run (which has no cell at all).",
            "title": "Cancelled",
            "type": "boolean"
          },
          "computed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last compute time (formula cells).",
            "title": "Computed At"
          },
          "computing": {
            "default": false,
            "description": "Stale AND an active run has this row in its scope.",
            "title": "Computing",
            "type": "boolean"
          },
          "confidence": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The agent's own read on its answer (high/medium/low); null for actions that report none. What the grid's confidence glyph draws.",
            "title": "Confidence"
          },
          "credits_charged": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Credits charged for producing this value; null for free work (manual edits, formulas, cache hits).",
            "title": "Credits Charged"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The cell's evaluation error, when it failed.",
            "title": "Error"
          },
          "error_class": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Machine-readable class of a failed enrichment cell (timeout, rate_limited, schema_violation, ...); null for formula errors and everything that is not an error.",
            "title": "Error Class"
          },
          "manual_override": {
            "default": false,
            "description": "A hand-entered correction on an enrichment cell. Runs pass over it unless they explicitly target the cell; the grid marks it.",
            "title": "Manual Override",
            "type": "boolean"
          },
          "settled_as": {
            "$ref": "#/components/schemas/TableCellSettlement",
            "default": "pending",
            "description": "How the last attempt on this cell ENDED, never what it shows.\n\nThe grid needs it to tell `no_data` (ran, found nothing) from `pending` (never ran). Both render blank, and on a formula column neither carries an error to tell them apart, so without this a finished cell was indistinguishable from an untouched one."
          },
          "skipped_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Non-null means the last run deliberately held this cell back: a required input was empty, or the run condition was false. A third outcome distinct from value and error; nothing ran, nothing was charged.",
            "title": "Skipped Reason"
          },
          "stale": {
            "default": false,
            "description": "Value out of date; a recompute is pending.",
            "title": "Stale",
            "type": "boolean"
          },
          "updated_at": {
            "description": "When this cell was last written.",
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "value": {
            "description": "The cell value; numbers are surfaced as JSON numbers.",
            "title": "Value"
          },
          "version": {
            "description": "Per-cell watermark; apply a delta only if at least this.",
            "title": "Version",
            "type": "integer"
          },
          "waiting_on": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Non-null on a pending cell whose work was handed to a sender's LinkedIn browser, which fills the cell when it answers: what the cell waits for, as the customer reads it.",
            "title": "Waiting On"
          }
        },
        "required": [
          "value",
          "error",
          "version",
          "updated_at"
        ],
        "title": "TableCellSchema",
        "type": "object"
      },
      "TableCellSettlement": {
        "description": "How this cell's last attempt ENDED. Never what the cell shows.\n\nAnswers \"is any work owed here\", and nothing else. What a cell DISPLAYS is\nstill read from the typed value slots, and must stay that way: sorting,\nfiltering and ``HAS_RESULTS`` all ask what the cell contains. Only\ncompleteness asks this.\n\nTHE FACT THAT WAS MISSING. The table stored what a cell contains and had no\ncolumn for whether work was still owed on it, so every completeness figure\nguessed the second from the first. The guess was wrong in both directions.\nA cell that ran cleanly and produced nothing is DONE, and it read as\npermanently incomplete. On an AI column that is the majority outcome, so a\ntable whose every run had finished could never reach 100%. Meanwhile a\nprovider's ``200 OK`` carrying ``{\"email\": None}`` read as filled.\n\nDeliberately ORTHOGONAL to ``stale``. A stale cell keeps the settlement of\nthe attempt that produced the value it is still showing; freshness is the\n``stale`` flag's job, and duplicating it here would give one fact two homes\nthat could disagree. \"Complete\" is therefore a conjunction of the two, and\nthe aggregate spells it out rather than hiding it in a member.\n\nMembers mirror the run counters on ``table_run`` (``cells_done`` /\n``_failed`` / ``_skipped`` / ``_no_data``) one for one, so the footer\nmid-run and the footer idle finally measure comparable things.",
        "enum": [
          "succeeded",
          "no_data",
          "skipped",
          "failed",
          "pending"
        ],
        "title": "TableCellSettlement",
        "type": "string"
      },
      "TableCellsBulkEditRequestSchema": {
        "description": "Request body for the bulk cell write: all-or-nothing, one recompute run.",
        "properties": {
          "edits": {
            "description": "The cell edits to apply.",
            "items": {
              "$ref": "#/components/schemas/TableCellBulkEditItemSchema"
            },
            "maxItems": 1000,
            "minItems": 1,
            "title": "Edits",
            "type": "array"
          },
          "restore": {
            "default": false,
            "description": "History only: set by the grid's undo and redo, which put back exactly what a cell held before. A Select or Multi-select value the column's options no longer name is then written back as it was, and no option is added; a number goes back with every digit it had, unrounded. Every other writer, AI agents and integrations included, leaves it false: a new value must be one of the column's options, and a number is rounded to the column's places.",
            "title": "Restore",
            "type": "boolean"
          }
        },
        "required": [
          "edits"
        ],
        "title": "TableCellsBulkEditRequestSchema",
        "type": "object"
      },
      "TableCellsBulkMutationResponseSchema": {
        "description": "Read-your-writes result of a bulk cell write. Never carries a run ID.\n\n``rows`` covers every row named by the request, including ones whose edits\nwere all same-value no-ops, so the client can reconcile its whole\nselection in one pass.",
        "properties": {
          "applied": {
            "description": "Edits that changed a value and were written.",
            "title": "Applied",
            "type": "integer"
          },
          "recomputed_column_ids": {
            "description": "Formula columns recomputed INLINE within this request. Their values in `rows` are final and no background run was requested. Empty when a run was queued instead.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Recomputed Column Ids",
            "type": "array"
          },
          "rows": {
            "items": {
              "$ref": "#/components/schemas/TableRowSchema"
            },
            "title": "Rows",
            "type": "array"
          },
          "skipped": {
            "description": "Same-value edits that wrote nothing.",
            "title": "Skipped",
            "type": "integer"
          },
          "stale_column_ids": {
            "description": "Transitive formula dependents now marked stale across all edited rows.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Stale Column Ids",
            "type": "array"
          },
          "updated": {
            "description": "Cells whose value changed; the same as applied.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated",
          "rows",
          "stale_column_ids",
          "applied",
          "skipped"
        ],
        "title": "TableCellsBulkMutationResponseSchema",
        "type": "object"
      },
      "TableCellsSubjectSchema": {
        "description": "Cells of one agent column.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "kind": {
            "const": "table_cells",
            "title": "Kind",
            "type": "string"
          },
          "record_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "title": "Record Ids",
            "type": "array"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "table_id",
          "column_id",
          "record_ids"
        ],
        "title": "TableCellsSubjectSchema",
        "type": "object"
      },
      "TableChangeCase-Input": {
        "description": "Change the case of a string value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "change_case",
            "default": "change_case",
            "title": "Function",
            "type": "string"
          },
          "mode": {
            "enum": [
              "lower",
              "upper",
              "title"
            ],
            "title": "Mode",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "mode"
        ],
        "title": "TableChangeCase",
        "type": "object"
      },
      "TableChangeCase-Output": {
        "description": "Change the case of a string value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "change_case",
            "default": "change_case",
            "title": "Function",
            "type": "string"
          },
          "mode": {
            "enum": [
              "lower",
              "upper",
              "title"
            ],
            "title": "Mode",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "mode"
        ],
        "title": "TableChangeCase",
        "type": "object"
      },
      "TableChangeEventSchema": {
        "description": "One frame of the change feed, discriminated by ``kind``.\n\nA wrapper model rather than a bare union so the whole vocabulary lands in\nthe OpenAPI document as a single named schema the client can switch on.",
        "properties": {
          "event": {
            "description": "The event body; switch on `kind`.",
            "discriminator": {
              "mapping": {
                "cell_activity": "#/components/schemas/TableCellActivityEventSchema",
                "columns_changed": "#/components/schemas/TableColumnsChangedEventSchema",
                "hello": "#/components/schemas/TableHelloEventSchema",
                "reconnect": "#/components/schemas/TableReconnectEventSchema",
                "resync": "#/components/schemas/TableResyncEventSchema",
                "rows_changed": "#/components/schemas/TableRowsChangedEventSchema",
                "rows_invalidated": "#/components/schemas/TableRowsInvalidatedEventSchema",
                "run_changed": "#/components/schemas/TableRunChangedEventSchema",
                "table_changed": "#/components/schemas/TableChangedEventSchema",
                "table_deleted": "#/components/schemas/TableDeletedEventSchema",
                "ui_prefs_changed": "#/components/schemas/TableUIPrefsChangedEventSchema"
              },
              "propertyName": "kind"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/TableHelloEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableRowsChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableRowsInvalidatedEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableColumnsChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableUIPrefsChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableDeletedEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableRunChangedEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableCellActivityEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableResyncEventSchema"
              },
              {
                "$ref": "#/components/schemas/TableReconnectEventSchema"
              }
            ],
            "title": "Event"
          }
        },
        "required": [
          "event"
        ],
        "title": "TableChangeEventSchema",
        "type": "object"
      },
      "TableChangedEventSchema": {
        "description": "The table definition changed (name, description, or row counter).",
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "kind": {
            "const": "table_changed",
            "default": "table_changed",
            "title": "Kind",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "row_count": {
            "title": "Row Count",
            "type": "integer"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "name",
          "description",
          "row_count",
          "updated_at"
        ],
        "title": "TableChangedEventSchema",
        "type": "object"
      },
      "TableClamp-Input": {
        "description": "Clamp a numeric value to an inclusive range.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "clamp",
            "default": "clamp",
            "title": "Function",
            "type": "string"
          },
          "max_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Value"
          },
          "min_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Value"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableClamp",
        "type": "object"
      },
      "TableClamp-Output": {
        "description": "Clamp a numeric value to an inclusive range.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "clamp",
            "default": "clamp",
            "title": "Function",
            "type": "string"
          },
          "max_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Value"
          },
          "min_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Value"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableClamp",
        "type": "object"
      },
      "TableCoalesce-Input": {
        "description": "Substitute a default (a literal or another column) when the input is empty.",
        "properties": {
          "default_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Value"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "coalesce",
            "default": "coalesce",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "default_value"
        ],
        "title": "TableCoalesce",
        "type": "object"
      },
      "TableCoalesce-Output": {
        "description": "Substitute a default (a literal or another column) when the input is empty.",
        "properties": {
          "default_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Value"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "coalesce",
            "default": "coalesce",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "default_value"
        ],
        "title": "TableCoalesce",
        "type": "object"
      },
      "TableColumnColorLabelsReadSchema": {
        "description": "What this organisation calls each column tint.",
        "properties": {
          "labels": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Colour token to this organisation's name for it. SPARSE: a token that is absent has not been renamed, and the client shows its built-in name.",
            "propertyNames": {
              "$ref": "#/components/schemas/TableColumnUIColor"
            },
            "title": "Labels",
            "type": "object"
          }
        },
        "required": [
          "labels"
        ],
        "title": "TableColumnColorLabelsReadSchema",
        "type": "object"
      },
      "TableColumnColorLabelsUpdateSchema": {
        "description": "Request body replacing the organisation's colour names.",
        "properties": {
          "labels": {
            "additionalProperties": {
              "maxLength": 40,
              "type": "string"
            },
            "description": "The complete set of names. A REPLACE, not a merge: a token omitted here, or given a blank name, goes back to its built-in name.",
            "propertyNames": {
              "$ref": "#/components/schemas/TableColumnUIColor"
            },
            "title": "Labels",
            "type": "object"
          }
        },
        "required": [
          "labels"
        ],
        "title": "TableColumnColorLabelsUpdateSchema",
        "type": "object"
      },
      "TableColumnCreateSchema": {
        "description": "Request body for creating a table column.",
        "properties": {
          "auto_run": {
            "default": true,
            "description": "Whether data changes (cell edits, new rows) recompute this column by themselves. Off, its cells go visibly stale and wait for an explicit run. Explicit runs and definition edits ignore it. IGNORED for export columns, which are always created with auto-run off. An export writes into a connected destination, so it may only be set to run by itself in a later, deliberate update.",
            "title": "Auto Run",
            "type": "boolean"
          },
          "column_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnType"
              },
              {
                "type": "null"
              }
            ],
            "description": "The semantic column type. Required for manual columns; for formula columns it defaults to the plain type for the chain's derived output and must otherwise be able to store it."
          },
          "data_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PropertyType"
              },
              {
                "type": "null"
              }
            ],
            "description": "DEPRECATED: send `column_type` instead. Accepted for one release so a client from before semantic types keeps working; it is read as the plain column type for that storage type, and is ignored when `column_type` is set."
          },
          "definition": {
            "$ref": "#/components/schemas/TableColumnDefinition-Input",
            "description": "The column definition (a discriminated union: the kind lives inside it)."
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Optional note on what the column holds and where it comes from.",
            "title": "Description"
          },
          "display_name": {
            "description": "Column display name, unique per table.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Display Name",
            "type": "string"
          },
          "expand_output_fields": {
            "default": true,
            "description": "For a multi-field enrichment, also create one child column per declared scalar output field, reading that field out of this column's payload. The payload column itself stays as the record of what came back; the children are what a person sorts, filters and exports on. Ignored for every other kind of column, and for a single-field output. There the parent column already IS the field. Set false to create the payload column alone.",
            "title": "Expand Output Fields",
            "type": "boolean"
          },
          "output_column_names": {
            "additionalProperties": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "description": "What to CALL each fanned-out child column, keyed by output field name. The author names them while setting the column up, so the preview they were shown is what the table gets. A field with no entry keeps the derived name, and a name already taken on the table falls back to the derived one rather than losing the column. Ignored when expand_output_fields is false, and CREATE only. An edit never renames a column that already exists.",
            "maxProperties": 50,
            "propertyNames": {
              "maxLength": 100,
              "minLength": 1
            },
            "title": "Output Column Names",
            "type": "object"
          },
          "position": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Insert position; appended when omitted.",
            "title": "Position"
          },
          "refresh_interval_hours": {
            "default": 0,
            "description": "How often to re-run this column on its own, in hours. 0 is off. Capped at 8760 (a year), which is the point past which a schedule stops being one.",
            "maximum": 8760.0,
            "minimum": 0.0,
            "title": "Refresh Interval Hours",
            "type": "integer"
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "A formula whose result gates this column per row: the cell runs only where it evaluates truthy, and rows where it does not are left as they are rather than cleared. Null runs every row. A gate that fails to evaluate does NOT hold a row back: an unknown answer runs."
          },
          "run_condition_view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A saved view whose filter this column follows as its run condition. When set, the engine evaluates membership in the view's current filter at run time, so the gate updates automatically when the view's filter changes. Editing the run condition directly detaches from the view. Mutually exclusive with an explicit run_condition. Set one or the other, not both.",
            "title": "Run Condition View Id"
          },
          "run_delay_seconds": {
            "default": 0,
            "description": "Seconds to wait after the run's conditions are met before this column runs. 0 runs immediately. Capped at 600 (10 minutes). A longer wait is a schedule, not a delay.",
            "maximum": 600.0,
            "minimum": 0.0,
            "title": "Run Delay Seconds",
            "type": "integer"
          },
          "suppress_run": {
            "default": false,
            "description": "Create the column without computing it. Its cells are left empty and `pending_recompute` is set, so the column reads as waiting for a run rather than as one that ran and found nothing. For a formula over a large table, where the author wants the shape saved now and the cost paid when they say so.",
            "title": "Suppress Run",
            "type": "boolean"
          },
          "type_options": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnTypeOptions-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "Per-type options; omit for the type's defaults."
          }
        },
        "required": [
          "definition",
          "display_name"
        ],
        "title": "TableColumnCreateSchema",
        "type": "object"
      },
      "TableColumnDefinition-Input": {
        "description": "Discriminated union of column definitions.\n\nA ``RootModel`` is required because ``PydanticJSON`` needs a ``BaseModel``\nsubclass to (de)serialize the stored JSON. Consumers always access the\nconcrete member via ``.root``.",
        "discriminator": {
          "mapping": {
            "enrichment": "#/components/schemas/EnrichmentColumnDefinition-Input",
            "export": "#/components/schemas/ExportColumnDefinition-Input",
            "formula": "#/components/schemas/FormulaColumnDefinition-Input",
            "manual": "#/components/schemas/ManualColumnDefinition",
            "sequence": "#/components/schemas/SequenceColumnDefinition-Input",
            "source": "#/components/schemas/SourceColumnDefinition"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ManualColumnDefinition"
          },
          {
            "$ref": "#/components/schemas/FormulaColumnDefinition-Input"
          },
          {
            "$ref": "#/components/schemas/EnrichmentColumnDefinition-Input"
          },
          {
            "$ref": "#/components/schemas/SourceColumnDefinition"
          },
          {
            "$ref": "#/components/schemas/ExportColumnDefinition-Input"
          },
          {
            "$ref": "#/components/schemas/SequenceColumnDefinition-Input"
          }
        ],
        "title": "TableColumnDefinition"
      },
      "TableColumnDefinition-Output": {
        "description": "Discriminated union of column definitions.\n\nA ``RootModel`` is required because ``PydanticJSON`` needs a ``BaseModel``\nsubclass to (de)serialize the stored JSON. Consumers always access the\nconcrete member via ``.root``.",
        "discriminator": {
          "mapping": {
            "enrichment": "#/components/schemas/EnrichmentColumnDefinition-Output",
            "export": "#/components/schemas/ExportColumnDefinition-Output",
            "formula": "#/components/schemas/FormulaColumnDefinition-Output",
            "manual": "#/components/schemas/ManualColumnDefinition",
            "sequence": "#/components/schemas/SequenceColumnDefinition-Output",
            "source": "#/components/schemas/SourceColumnDefinition"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/ManualColumnDefinition"
          },
          {
            "$ref": "#/components/schemas/FormulaColumnDefinition-Output"
          },
          {
            "$ref": "#/components/schemas/EnrichmentColumnDefinition-Output"
          },
          {
            "$ref": "#/components/schemas/SourceColumnDefinition"
          },
          {
            "$ref": "#/components/schemas/ExportColumnDefinition-Output"
          },
          {
            "$ref": "#/components/schemas/SequenceColumnDefinition-Output"
          }
        ],
        "title": "TableColumnDefinition"
      },
      "TableColumnGenerateRequestSchema": {
        "description": "Request body for generating a formula definition from a description.",
        "properties": {
          "instruction": {
            "description": "A natural-language description of the formula to build.",
            "maxLength": 2000,
            "minLength": 1,
            "title": "Instruction",
            "type": "string"
          }
        },
        "required": [
          "instruction"
        ],
        "title": "TableColumnGenerateRequestSchema",
        "type": "object"
      },
      "TableColumnGenerateResponseSchema": {
        "description": "A generated formula definition, validated but NOT saved.\n\nThe caller reviews it: the same definition shape the editor produces by\nhand, so it flows into the existing preview and create endpoints unchanged.",
        "properties": {
          "data_type": {
            "$ref": "#/components/schemas/PropertyType",
            "description": "The data type the generated chain produces."
          },
          "definition": {
            "$ref": "#/components/schemas/TableColumnDefinition-Output",
            "description": "The generated formula definition, ready to preview or create."
          },
          "explanation": {
            "description": "One sentence describing what the chain does.",
            "title": "Explanation",
            "type": "string"
          },
          "suggested_name": {
            "description": "A proposed column name. The editor adopts it when the user has not named the column, so a generated formula is savable without a second step.",
            "title": "Suggested Name",
            "type": "string"
          }
        },
        "required": [
          "definition",
          "data_type",
          "suggested_name",
          "explanation"
        ],
        "title": "TableColumnGenerateResponseSchema",
        "type": "object"
      },
      "TableColumnGroupCreateRequestSchema": {
        "description": "Request body for grouping columns.",
        "properties": {
          "column_ids": {
            "description": "The columns to group; at least two, each currently ungrouped. They are pulled together at the leftmost member's position, keeping their current relative order. The LAST member becomes the group's output.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "minItems": 2,
            "title": "Column Ids",
            "type": "array"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The group's name; omit for the default label.",
            "title": "Name"
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "A per-row gate every member without one of its own inherits. It may not read a column inside the group."
          },
          "ui_color": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnUIColor"
              },
              {
                "type": "null"
              }
            ],
            "description": "Palette token for the group's band; omit for a neutral band."
          }
        },
        "required": [
          "column_ids"
        ],
        "title": "TableColumnGroupCreateRequestSchema",
        "type": "object"
      },
      "TableColumnGroupMemberSchema": {
        "description": "One group member with its output flag, in the group's display order.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "is_output": {
            "description": "Whether this member stays visible while the group is collapsed.",
            "title": "Is Output",
            "type": "boolean"
          }
        },
        "required": [
          "column_id",
          "is_output"
        ],
        "title": "TableColumnGroupMemberSchema",
        "type": "object"
      },
      "TableColumnGroupMembershipSchema": {
        "description": "One column's new group membership, carried by a reorder.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "group_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The group to put the column in, or null to take it out of its group.",
            "title": "Group Id"
          },
          "is_output": {
            "default": false,
            "description": "Whether the column stays visible while its new group is collapsed. Ignored when `group_id` is null.",
            "title": "Is Output",
            "type": "boolean"
          }
        },
        "required": [
          "column_id",
          "group_id"
        ],
        "title": "TableColumnGroupMembershipSchema",
        "type": "object"
      },
      "TableColumnGroupReadSchema": {
        "description": "A user-managed column group, membership resolved in position order.",
        "properties": {
          "collapsed": {
            "description": "Whether the grid folds the group down to its output members. Purely presentational: folded members' cells are still fetched, so expanding costs nothing.",
            "title": "Collapsed",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "members": {
            "description": "The member columns in position order, with their output flags.",
            "items": {
              "$ref": "#/components/schemas/TableColumnGroupMemberSchema"
            },
            "title": "Members",
            "type": "array"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The group's name; null renders the client default label.",
            "title": "Name"
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "The group's per-row gate, verbatim; null gates nothing. Every member without a gate of its own carries a copy in its `run_condition` (marked by `run_condition_group_id`), so the columns themselves say what runs."
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "ui_color": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnUIColor"
              },
              {
                "type": "null"
              }
            ],
            "description": "Palette token for the group's band, or null for a neutral band. A token rather than a hex: the grid renders light and dark, and one stored colour is only legible in one of them."
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "name",
          "collapsed",
          "ui_color",
          "members",
          "created_at",
          "updated_at"
        ],
        "title": "TableColumnGroupReadSchema",
        "type": "object"
      },
      "TableColumnGroupUpdateRequestSchema": {
        "description": "Request body for updating a group (tri-state PATCH; members are full-state).",
        "properties": {
          "collapsed": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Whether the grid folds the group down to its output members.",
            "title": "Collapsed"
          },
          "members": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TableColumnGroupMemberSchema"
                },
                "type": "array"
              },
              {}
            ],
            "description": "The FULL member list in its new order. Columns newly listed join the group and move into its block; current members left out are removed and land immediately after it. A group always has at least one member and at least one output: an empty list is refused (ungroup to dissolve the group), and so is a list with no output flagged.",
            "title": "Members"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New name. Set to null to restore the default label.",
            "title": "Name"
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Input"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New per-row gate for the group. Set to null to clear it, which also clears every member's inherited copy. It may not read a column inside the group.",
            "title": "Run Condition"
          },
          "ui_color": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnUIColor"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "Palette token for the group's band. Set to null for a neutral band.",
            "title": "Ui Color"
          }
        },
        "title": "TableColumnGroupUpdateRequestSchema",
        "type": "object"
      },
      "TableColumnKind": {
        "description": "Kind of a table column.\n\n``MANUAL`` cells are user-editable; ``FORMULA`` cells are a pure computed\nchain over other columns; ``ENRICHMENT`` cells are produced by an external\naction (an AI model, a research agent) run once per row. Formula and\nenrichment cells are both computed (read-only in the grid) but only\nenrichment work leaves the process and costs credits.\n\n``SOURCE`` cells hold one imported record verbatim, written only by the\ntable's import source. Like ``MANUAL`` it is an externally-written leaf\nrather than a computed node (it joins no run plan and derives from no\nother column), but unlike ``MANUAL`` nobody may edit or retype it: the\nwhole point is that a refresh can overwrite it wholesale, and every\n``get_path`` column promoted off it reads paths that only survive while\nits shape does.\n\n``EXPORT`` cells hold the RECEIPT of pushing the row to a connected\ndestination (status, the destination record id, when it happened), never\nthe row's own data. The mirror image of ``SOURCE``: where a source column\nis an externally-written leaf, an export column is an externally-READ\nleaf. It joins the run plan like a computed column (its mappings are\ndependencies, so a changed input re-pushes) but nothing may depend on it\nin turn, nobody may edit it (a hand-edited receipt would silently pin the\nrow out of future pushes), and re-running it means \"push again\", not\n\"re-answer\".\n\n``SEQUENCE`` cells hold a contact's live status in an email sequence, or\nthe messages it sent them, written by the outreach send engine and nobody\nelse: an externally-written leaf with no run plan, no dependencies, no user\nedits, no retyping. A status column, like ``EXPORT`` receipts, may not be\nreferenced in a formula: the status only exists to be looked at, never\nderived from. A messages column may, the way a ``SOURCE`` record may: the\nengine requests a run of its dependents whenever it rewrites a cell. The\ncolumns are created by the sequence that targets the table, not from the\nadd-column catalog.",
        "enum": [
          "manual",
          "formula",
          "enrichment",
          "source",
          "export",
          "sequence"
        ],
        "title": "TableColumnKind",
        "type": "string"
      },
      "TableColumnNameSuggestionResponseSchema": {
        "description": "The name a new column would take from a base name, made unique on the table.",
        "properties": {
          "suggested_name": {
            "description": "The base name unchanged if free, or its first free \"(n)\" variant.",
            "title": "Suggested Name",
            "type": "string"
          }
        },
        "required": [
          "suggested_name"
        ],
        "title": "TableColumnNameSuggestionResponseSchema",
        "type": "object"
      },
      "TableColumnPreviewRequestSchema": {
        "description": "Request body for previewing an unsaved formula definition.",
        "properties": {
          "definition": {
            "$ref": "#/components/schemas/TableColumnDefinition-Input",
            "description": "The formula definition to evaluate; every other kind, Use AI and agent columns included, is rejected."
          }
        },
        "required": [
          "definition"
        ],
        "title": "TableColumnPreviewRequestSchema",
        "type": "object"
      },
      "TableColumnPreviewResponseSchema": {
        "description": "Preview results over the table's first rows; nothing is persisted.",
        "properties": {
          "results": {
            "items": {
              "$ref": "#/components/schemas/TableColumnPreviewRowSchema"
            },
            "title": "Results",
            "type": "array"
          }
        },
        "required": [
          "results"
        ],
        "title": "TableColumnPreviewResponseSchema",
        "type": "object"
      },
      "TableColumnPreviewRowSchema": {
        "description": "One row's preview evaluation result.",
        "properties": {
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The evaluation error, when the chain failed.",
            "title": "Error"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "value": {
            "description": "The evaluated value; numbers surface as JSON numbers.",
            "title": "Value"
          }
        },
        "required": [
          "record_id",
          "value",
          "error"
        ],
        "title": "TableColumnPreviewRowSchema",
        "type": "object"
      },
      "TableColumnPromoteFieldRequestSchema": {
        "description": "Promote one declared output field of an enrichment into its own column.",
        "properties": {
          "confirm_overwrite": {
            "default": false,
            "description": "Explicit acknowledgement that mapping to an existing column overwrites what that column holds. Required with target_column_id.",
            "title": "Confirm Overwrite",
            "type": "boolean"
          },
          "display_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The child column's name; the field's name when omitted.",
            "title": "Display Name"
          },
          "field_name": {
            "description": "The declared output field to promote.",
            "maxLength": 100,
            "minLength": 1,
            "title": "Field Name",
            "type": "string"
          },
          "target_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Map onto this EXISTING manual column instead of creating one. The field's current values overwrite everything the column holds. Destructive; requires confirm_overwrite.",
            "title": "Target Column Id"
          }
        },
        "required": [
          "field_name"
        ],
        "title": "TableColumnPromoteFieldRequestSchema",
        "type": "object"
      },
      "TableColumnReadSchema": {
        "description": "A table column with its definition and dependency metadata.",
        "properties": {
          "ai_made": {
            "default": false,
            "description": "Whether the AI assistant created this column through a workspace action. A fact about who made it, not a state: it stays true after a person edits the column.",
            "title": "Ai Made",
            "type": "boolean"
          },
          "auto_run": {
            "default": true,
            "description": "Whether data changes recompute this column by themselves; explicit runs ignore it.",
            "title": "Auto Run",
            "type": "boolean"
          },
          "column_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "description": "The semantic type; what the cell renders and validates as."
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "data_type": {
            "$ref": "#/components/schemas/PropertyType",
            "description": "The storage type `column_type` resolves to, and so which typed value slot the cells live in. Derived, never chosen."
          },
          "definition": {
            "$ref": "#/components/schemas/TableColumnDefinition-Output",
            "description": "The stored definition, verbatim."
          },
          "definition_version": {
            "description": "Bumped on definition changes; cosmetic edits leave it untouched.",
            "title": "Definition Version",
            "type": "integer"
          },
          "depends_on_column_ids": {
            "description": "Direct chain inputs; empty for manual columns.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Depends On Column Ids",
            "type": "array"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Author-written note on what the column holds; null when unset.",
            "title": "Description"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "group_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column group this column belongs to, or null. Groups are user-managed entities delivered on the column list's `groups`; this field is the membership edge, and the members' order is simply the columns' position order.",
            "title": "Group Id"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_group_output": {
            "description": "Whether this member stays visible while its group is collapsed. Meaningful only while `group_id` is set. Every group keeps at least one output.",
            "title": "Is Group Output",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/TableColumnKind"
          },
          "pending_recompute": {
            "default": false,
            "description": "The definition has changed since these cells were last computed, so they are stale. Set by a save made with `suppress_run`, cleared when the column next finishes a run.",
            "title": "Pending Recompute",
            "type": "boolean"
          },
          "position": {
            "title": "Position",
            "type": "integer"
          },
          "refresh_interval_hours": {
            "default": 0,
            "description": "Self re-run cadence in hours; 0 is off.",
            "title": "Refresh Interval Hours",
            "type": "integer"
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "The per-row gate, verbatim; null runs every row."
          },
          "run_condition_group_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When set, `run_condition` is inherited from this column group and is rewritten whenever the group's changes. Set a `run_condition` on the column to override it, or clear the column's to inherit again.",
            "title": "Run Condition Group Id"
          },
          "run_condition_view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When set, the column follows this saved view's filter as its run condition. The engine evaluates view membership at run time rather than reading `run_condition`. Editing the run condition directly detaches from the view.",
            "title": "Run Condition View Id"
          },
          "run_delay_seconds": {
            "default": 0,
            "description": "Pre-run wait in seconds; 0 runs immediately.",
            "title": "Run Delay Seconds",
            "type": "integer"
          },
          "supported_filter_operators": {
            "description": "Every filter operator this column admits, in display order. The server owns the list so a picker cannot offer a pairing the rows query will reject: value operators follow the storage slot, and a computed column additionally admits the execution-state family (has an error, has results, has not run, is stale, ...), which reads run metadata a manual column never writes.",
            "items": {
              "$ref": "#/components/schemas/TableFilterOperator"
            },
            "title": "Supported Filter Operators",
            "type": "array"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "type_options": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnTypeOptions-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "Per-type options; null means the type's defaults."
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "display_name",
          "description",
          "definition",
          "kind",
          "column_type",
          "type_options",
          "data_type",
          "depends_on_column_ids",
          "group_id",
          "is_group_output",
          "supported_filter_operators",
          "definition_version",
          "position",
          "created_at",
          "updated_at"
        ],
        "title": "TableColumnReadSchema",
        "type": "object"
      },
      "TableColumnReorderRequestSchema": {
        "description": "Request body for reordering a table's columns (full permutation).",
        "properties": {
          "column_ids": {
            "description": "Every column of the table exactly once, in the new display order.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 1,
            "title": "Column Ids",
            "type": "array"
          },
          "group_membership": {
            "description": "Columns this reorder also moves in or out of a column group; columns left out keep the group they are in. This is how a drag that drops a column between two members of a group makes it a member: the new order and the new membership land together, so the group is never momentarily split. A group the list would leave with no member, or with no output, is refused rather than repaired.",
            "items": {
              "$ref": "#/components/schemas/TableColumnGroupMembershipSchema"
            },
            "title": "Group Membership",
            "type": "array"
          }
        },
        "required": [
          "column_ids"
        ],
        "title": "TableColumnReorderRequestSchema",
        "type": "object"
      },
      "TableColumnReorderResponseSchema": {
        "description": "Every column of a table as a reorder leaves it, in the new position order.",
        "properties": {
          "data": {
            "description": "Every column in its new place. A column the reorder moved in or out of a group carries its new `group_id` and `is_group_output`.",
            "items": {
              "$ref": "#/components/schemas/TableColumnWithUIPrefsSchema"
            },
            "title": "Data",
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "title": "TableColumnReorderResponseSchema",
        "type": "object"
      },
      "TableColumnRetypePreviewResponseSchema": {
        "description": "What changing a column's type would do to the values already in it.\n\nAsking changes nothing. When the type does change, every value the new type\ncan read is converted into it; ``cleared_count`` is the rest, which are left\nblank, so it is the number a person confirms before the change is made.",
        "properties": {
          "cleared_count": {
            "description": "Of those, how many the new type cannot hold and would be cleared.",
            "title": "Cleared Count",
            "type": "integer"
          },
          "column_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "description": "The type the preview is for."
          },
          "value_count": {
            "description": "Cells in the column that hold a value today.",
            "title": "Value Count",
            "type": "integer"
          }
        },
        "required": [
          "column_type",
          "value_count",
          "cleared_count"
        ],
        "title": "TableColumnRetypePreviewResponseSchema",
        "type": "object"
      },
      "TableColumnType": {
        "description": "The type a user picks for a table column.\n\nOrdered as the picker shows them, which is also the order the groups below\nrun in: text-ish, then numeric, then choice, then structured.",
        "enum": [
          "text",
          "paragraph",
          "url",
          "email",
          "image_url",
          "person",
          "select",
          "number",
          "decimal",
          "currency",
          "checkbox",
          "date",
          "multi_select",
          "list",
          "object"
        ],
        "title": "TableColumnType",
        "type": "string"
      },
      "TableColumnTypeOptions-Input": {
        "description": "Discriminated union of per-type column options.\n\nMirrors ``TableColumnDefinition``: a ``RootModel`` because ``PydanticJSON``\nneeds a ``BaseModel`` subclass to (de)serialize the stored JSON, discriminated\non the field that names the member. Consumers reach the concrete member\nthrough ``.root``.\n\nTypes absent from the union simply have no options. The stored column is\nNULL, meaning \"whatever the defaults are now\". Defaults are never written\ninto rows.",
        "discriminator": {
          "mapping": {
            "currency": "#/components/schemas/CurrencyOptions",
            "decimal": "#/components/schemas/DecimalOptions",
            "multi_select": "#/components/schemas/MultiSelectOptions",
            "select": "#/components/schemas/SelectOptions"
          },
          "propertyName": "type"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/SelectOptions"
          },
          {
            "$ref": "#/components/schemas/MultiSelectOptions"
          },
          {
            "$ref": "#/components/schemas/CurrencyOptions"
          },
          {
            "$ref": "#/components/schemas/DecimalOptions"
          }
        ],
        "title": "TableColumnTypeOptions"
      },
      "TableColumnTypeOptions-Output": {
        "description": "Discriminated union of per-type column options.\n\nMirrors ``TableColumnDefinition``: a ``RootModel`` because ``PydanticJSON``\nneeds a ``BaseModel`` subclass to (de)serialize the stored JSON, discriminated\non the field that names the member. Consumers reach the concrete member\nthrough ``.root``.\n\nTypes absent from the union simply have no options. The stored column is\nNULL, meaning \"whatever the defaults are now\". Defaults are never written\ninto rows.",
        "discriminator": {
          "mapping": {
            "currency": "#/components/schemas/CurrencyOptions",
            "decimal": "#/components/schemas/DecimalOptions",
            "multi_select": "#/components/schemas/MultiSelectOptions",
            "select": "#/components/schemas/SelectOptions"
          },
          "propertyName": "type"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/SelectOptions"
          },
          {
            "$ref": "#/components/schemas/MultiSelectOptions"
          },
          {
            "$ref": "#/components/schemas/CurrencyOptions"
          },
          {
            "$ref": "#/components/schemas/DecimalOptions"
          }
        ],
        "title": "TableColumnTypeOptions"
      },
      "TableColumnUIColor": {
        "description": "Semantic tint token, shared by a column and by a column GROUP.\n\nStored as a token rather than a hex value because the grid renders in both a\nlight and a dark theme, and a single stored colour is only legible in one of\nthem. The client maps each token to a per-mode value.\n\nDeliberately excludes teal: the brand primary is used for range selection and\nthe anchor outline, so a teal column would read as permanently selected.\n\nLives HERE rather than in ``table_column_prefs``, where it started, because\ntwo domains now need it and the layering only allows one direction. A\ncolumn's tint is stored in ``table_column_prefs`` (org-shared appearance,\nkeyed by column) while a group's is a field on the group row itself in\n``table_column``, and ``table_column_prefs`` sits ABOVE ``table_column`` in\nthe domain layers, so the token had to move DOWN to be reachable from both.\n``table_column_prefs.types`` re-exports it, which is why that move touched\nno existing import.\n\nOne enum for both on purpose: a colour token is a shared vocabulary (a team\nagreeing that amber means \"needs review\" is agreeing about it across\ncolumns and groups alike) and the organisation's renaming of the palette\n(``table_column_color_labels``) is keyed by this token, so a second enum\nwould give groups colours the rename dialog could not name.",
        "enum": [
          "gray",
          "red",
          "orange",
          "amber",
          "green",
          "blue",
          "purple",
          "pink"
        ],
        "title": "TableColumnUIColor",
        "type": "string"
      },
      "TableColumnUIPrefsSchema": {
        "description": "How one column is displayed to the caller.\n\nHidden, pinned and width are the caller's own where they set one, laid over\nthe team's; the colour tint is the team's. An API key sees the team's alone.\nAlways present on a column, whether or not anything has been customised:\na column nobody has touched reports the defaults rather than null.",
        "properties": {
          "color": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnUIColor"
              },
              {
                "type": "null"
              }
            ],
            "description": "Semantic palette token the client maps per theme; null means untinted."
          },
          "hidden": {
            "description": "Whether the grid omits the column; its cell values are untouched.",
            "title": "Hidden",
            "type": "boolean"
          },
          "pinned": {
            "description": "Whether the column is frozen to the left edge through horizontal scroll.",
            "title": "Pinned",
            "type": "boolean"
          },
          "width": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rendered width in pixels; null means the client default.",
            "title": "Width"
          }
        },
        "required": [
          "hidden",
          "pinned",
          "width",
          "color"
        ],
        "title": "TableColumnUIPrefsSchema",
        "type": "object"
      },
      "TableColumnUIPrefsUpdateSchema": {
        "description": "Request body for updating a column's display preferences (tri-state PATCH).",
        "properties": {
          "color": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnUIColor"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New palette token, the same for everyone. Set to null to clear the tint.",
            "title": "Color"
          },
          "hidden": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Hide the column from the grid, or show it. A signed-in person's choice is their own and stays theirs over the team's; an API key sets the team's.",
            "title": "Hidden"
          },
          "pinned": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Pin the column to the left edge, or unpin it. A signed-in person's choice is their own and stays theirs over the team's; an API key sets the team's.",
            "title": "Pinned"
          },
          "width": {
            "anyOf": [
              {
                "maximum": 720.0,
                "minimum": 64.0,
                "type": "integer"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New width in pixels, for a signed-in person their own. Null makes a person's column follow the team's width again; from an API key it restores the client default for the team.",
            "title": "Width"
          }
        },
        "title": "TableColumnUIPrefsUpdateSchema",
        "type": "object"
      },
      "TableColumnUpdateResultSchema": {
        "description": "A column update result; the recompute run (if due) appears on the next poll.",
        "properties": {
          "ai_made": {
            "default": false,
            "description": "Whether the AI assistant created this column through a workspace action. A fact about who made it, not a state: it stays true after a person edits the column.",
            "title": "Ai Made",
            "type": "boolean"
          },
          "auto_run": {
            "default": true,
            "description": "Whether data changes recompute this column by themselves; explicit runs ignore it.",
            "title": "Auto Run",
            "type": "boolean"
          },
          "cleared_count": {
            "description": "Values a type change could not convert into the new type and left blank; 0 when no value moved.",
            "title": "Cleared Count",
            "type": "integer"
          },
          "column_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "description": "The semantic type; what the cell renders and validates as."
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "data_type": {
            "$ref": "#/components/schemas/PropertyType",
            "description": "The storage type `column_type` resolves to, and so which typed value slot the cells live in. Derived, never chosen."
          },
          "definition": {
            "$ref": "#/components/schemas/TableColumnDefinition-Output",
            "description": "The stored definition, verbatim."
          },
          "definition_version": {
            "description": "Bumped on definition changes; cosmetic edits leave it untouched.",
            "title": "Definition Version",
            "type": "integer"
          },
          "depends_on_column_ids": {
            "description": "Direct chain inputs; empty for manual columns.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Depends On Column Ids",
            "type": "array"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Author-written note on what the column holds; null when unset.",
            "title": "Description"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "group_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column group this column belongs to, or null. Groups are user-managed entities delivered on the column list's `groups`; this field is the membership edge, and the members' order is simply the columns' position order.",
            "title": "Group Id"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_group_output": {
            "description": "Whether this member stays visible while its group is collapsed. Meaningful only while `group_id` is set. Every group keeps at least one output.",
            "title": "Is Group Output",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/TableColumnKind"
          },
          "pending_recompute": {
            "default": false,
            "description": "The definition has changed since these cells were last computed, so they are stale. Set by a save made with `suppress_run`, cleared when the column next finishes a run.",
            "title": "Pending Recompute",
            "type": "boolean"
          },
          "position": {
            "title": "Position",
            "type": "integer"
          },
          "refresh_interval_hours": {
            "default": 0,
            "description": "Self re-run cadence in hours; 0 is off.",
            "title": "Refresh Interval Hours",
            "type": "integer"
          },
          "requires_recompute": {
            "description": "Whether the update marked the column for recompute. The run itself arrives via the active-runs poll, never in this response.",
            "title": "Requires Recompute",
            "type": "boolean"
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "The per-row gate, verbatim; null runs every row."
          },
          "run_condition_group_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When set, `run_condition` is inherited from this column group and is rewritten whenever the group's changes. Set a `run_condition` on the column to override it, or clear the column's to inherit again.",
            "title": "Run Condition Group Id"
          },
          "run_condition_view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When set, the column follows this saved view's filter as its run condition. The engine evaluates view membership at run time rather than reading `run_condition`. Editing the run condition directly detaches from the view.",
            "title": "Run Condition View Id"
          },
          "run_delay_seconds": {
            "default": 0,
            "description": "Pre-run wait in seconds; 0 runs immediately.",
            "title": "Run Delay Seconds",
            "type": "integer"
          },
          "supported_filter_operators": {
            "description": "Every filter operator this column admits, in display order. The server owns the list so a picker cannot offer a pairing the rows query will reject: value operators follow the storage slot, and a computed column additionally admits the execution-state family (has an error, has results, has not run, is stale, ...), which reads run metadata a manual column never writes.",
            "items": {
              "$ref": "#/components/schemas/TableFilterOperator"
            },
            "title": "Supported Filter Operators",
            "type": "array"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "type_options": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnTypeOptions-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "Per-type options; null means the type's defaults."
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "display_name",
          "description",
          "definition",
          "kind",
          "column_type",
          "type_options",
          "data_type",
          "depends_on_column_ids",
          "group_id",
          "is_group_output",
          "supported_filter_operators",
          "definition_version",
          "position",
          "created_at",
          "updated_at",
          "requires_recompute",
          "cleared_count"
        ],
        "title": "TableColumnUpdateResultSchema",
        "type": "object"
      },
      "TableColumnUpdateSchema": {
        "description": "Request body for updating a table column (tri-state PATCH semantics).",
        "properties": {
          "auto_run": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Whether data changes recompute this column by themselves. Off, its cells go visibly stale and wait for an explicit run.",
            "title": "Auto Run"
          },
          "column_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnType"
              },
              {}
            ],
            "description": "New semantic type; any type may be requested. A change that stores values differently converts every value it can into the new type, and the response's cleared_count says how many it could not and left blank. The column preview endpoint forecasts this before you save.",
            "title": "Column Type"
          },
          "data_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PropertyType"
              },
              {}
            ],
            "description": "DEPRECATED: send `column_type` instead. Read as the plain column type for that storage type, and ignored when `column_type` is set.",
            "title": "Data Type"
          },
          "definition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Input"
              },
              {}
            ],
            "description": "New definition; replaces the whole union member. The kind is immutable.",
            "title": "Definition"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New description. Set to null to clear.",
            "title": "Description"
          },
          "display_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "title": "Display Name"
          },
          "expand_output_fields": {
            "default": true,
            "description": "For a multi-field enrichment, keep the fan-out in step with the declared output: create one child column per scalar output field this edit ADDS (the same fan-out a column of the same shape gets when it is created), and DELETE the column of a field it REMOVES, along with that column's values. A removed field's column reads a key the answer no longer carries, so it could only ever sit empty. A field the column already declared is left alone, and a column another column depends on is kept rather than breaking it. For a Use AI column, moving the fields it keeps puts its child columns in the group in the new order, and an added field's column goes right after the column of the field declared before it. Set false to change the output without touching any other column.",
            "title": "Expand Output Fields",
            "type": "boolean"
          },
          "output_column_names": {
            "additionalProperties": {
              "maxLength": 255,
              "minLength": 1,
              "type": "string"
            },
            "description": "What to CALL each child column this edit ADDS, keyed by output field name (the create request's field, read the same way). Without it a new child's header is derived from the field's key, which reads a hand-written name back as though it were one: a field called 'LinkedIn URL' becomes the column 'Linked In Url'. A field with no entry keeps the derived name, a name already taken on the table falls back to the derived one rather than losing the column, and a field this edit did not add is ignored. Ignored when expand_output_fields is false. Children that already exist are never renamed.",
            "maxProperties": 50,
            "propertyNames": {
              "maxLength": 100,
              "minLength": 1
            },
            "title": "Output Column Names",
            "type": "object"
          },
          "position": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Position"
          },
          "refresh_interval_hours": {
            "anyOf": [
              {
                "type": "integer"
              },
              {}
            ],
            "description": "New self re-run cadence in hours; 0 turns it off.",
            "ge": 0,
            "le": 8760,
            "title": "Refresh Interval Hours"
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Input"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "A formula whose result gates this column per row: the cell runs only where it evaluates truthy, and rows where it does not are left as they are rather than cleared. Null runs every row. A gate that fails to evaluate does NOT hold a row back: an unknown answer runs.",
            "title": "Run Condition"
          },
          "run_condition_view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "A saved view whose filter this column follows as its run condition, evaluated at run time so the gate tracks the view. Null detaches and goes back to running every row. Mutually exclusive with a non-null `run_condition` in the same request; omit it to leave the link alone.",
            "title": "Run Condition View Id"
          },
          "run_delay_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {}
            ],
            "description": "New pre-run wait in seconds; 0 runs immediately. Capped at 600.",
            "ge": 0,
            "le": 600,
            "title": "Run Delay Seconds"
          },
          "suppress_run": {
            "default": false,
            "description": "Save the change without recomputing. The column's cells keep their current values and `pending_recompute` is set, so the staleness is recorded rather than hidden; run the column when you are ready. A plain bool, not tri-state: it instructs THIS request and has no 'leave unchanged' meaning to carry over.",
            "title": "Suppress Run",
            "type": "boolean"
          },
          "type_options": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnTypeOptions-Input"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New per-type options. Set to null to clear them back to defaults.",
            "title": "Type Options"
          }
        },
        "title": "TableColumnUpdateSchema",
        "type": "object"
      },
      "TableColumnWithUIPrefsSchema": {
        "description": "A column plus its display preferences as the caller sees them.\n\nHidden, pinned and width are the caller's own laid over the team's; the\ncolour is the team's.\n\nOnly the list payloads carry preferences: they are the ones the grid renders\nfrom. Create and update responses stay on the bare read schema rather than\nadvertising a preferences object they did not fetch.",
        "properties": {
          "ai_made": {
            "default": false,
            "description": "Whether the AI assistant created this column through a workspace action. A fact about who made it, not a state: it stays true after a person edits the column.",
            "title": "Ai Made",
            "type": "boolean"
          },
          "auto_run": {
            "default": true,
            "description": "Whether data changes recompute this column by themselves; explicit runs ignore it.",
            "title": "Auto Run",
            "type": "boolean"
          },
          "column_type": {
            "$ref": "#/components/schemas/TableColumnType",
            "description": "The semantic type; what the cell renders and validates as."
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "data_type": {
            "$ref": "#/components/schemas/PropertyType",
            "description": "The storage type `column_type` resolves to, and so which typed value slot the cells live in. Derived, never chosen."
          },
          "definition": {
            "$ref": "#/components/schemas/TableColumnDefinition-Output",
            "description": "The stored definition, verbatim."
          },
          "definition_version": {
            "description": "Bumped on definition changes; cosmetic edits leave it untouched.",
            "title": "Definition Version",
            "type": "integer"
          },
          "depends_on_column_ids": {
            "description": "Direct chain inputs; empty for manual columns.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Depends On Column Ids",
            "type": "array"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Author-written note on what the column holds; null when unset.",
            "title": "Description"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "group_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column group this column belongs to, or null. Groups are user-managed entities delivered on the column list's `groups`; this field is the membership edge, and the members' order is simply the columns' position order.",
            "title": "Group Id"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_group_output": {
            "description": "Whether this member stays visible while its group is collapsed. Meaningful only while `group_id` is set. Every group keeps at least one output.",
            "title": "Is Group Output",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/TableColumnKind"
          },
          "link_issue": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What another table deleted from under this column, in the sentence its header shows: on a value a link brings back whose column there was deleted (it keeps its values and no longer updates), or on a link whose every matched column there was deleted. Null when nothing is wrong.",
            "title": "Link Issue"
          },
          "pending_recompute": {
            "default": false,
            "description": "The definition has changed since these cells were last computed, so they are stale. Set by a save made with `suppress_run`, cleared when the column next finishes a run.",
            "title": "Pending Recompute",
            "type": "boolean"
          },
          "position": {
            "title": "Position",
            "type": "integer"
          },
          "refresh_interval_hours": {
            "default": 0,
            "description": "Self re-run cadence in hours; 0 is off.",
            "title": "Refresh Interval Hours",
            "type": "integer"
          },
          "run_condition": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnDefinition-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "The per-row gate, verbatim; null runs every row."
          },
          "run_condition_group_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When set, `run_condition` is inherited from this column group and is rewritten whenever the group's changes. Set a `run_condition` on the column to override it, or clear the column's to inherit again.",
            "title": "Run Condition Group Id"
          },
          "run_condition_view_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When set, the column follows this saved view's filter as its run condition. The engine evaluates view membership at run time rather than reading `run_condition`. Editing the run condition directly detaches from the view.",
            "title": "Run Condition View Id"
          },
          "run_delay_seconds": {
            "default": 0,
            "description": "Pre-run wait in seconds; 0 runs immediately.",
            "title": "Run Delay Seconds",
            "type": "integer"
          },
          "supported_filter_operators": {
            "description": "Every filter operator this column admits, in display order. The server owns the list so a picker cannot offer a pairing the rows query will reject: value operators follow the storage slot, and a computed column additionally admits the execution-state family (has an error, has results, has not run, is stale, ...), which reads run metadata a manual column never writes.",
            "items": {
              "$ref": "#/components/schemas/TableFilterOperator"
            },
            "title": "Supported Filter Operators",
            "type": "array"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "type_options": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableColumnTypeOptions-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "Per-type options; null means the type's defaults."
          },
          "ui_prefs": {
            "$ref": "#/components/schemas/TableColumnUIPrefsSchema",
            "description": "How the column is displayed; all-defaults when nothing is customised."
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "display_name",
          "description",
          "definition",
          "kind",
          "column_type",
          "type_options",
          "data_type",
          "depends_on_column_ids",
          "group_id",
          "is_group_output",
          "supported_filter_operators",
          "definition_version",
          "position",
          "created_at",
          "updated_at",
          "ui_prefs"
        ],
        "title": "TableColumnWithUIPrefsSchema",
        "type": "object"
      },
      "TableColumnsChangedEventSchema": {
        "description": "A column was created, edited, deleted, or reordered. Refetch columns and rows.",
        "properties": {
          "kind": {
            "const": "columns_changed",
            "default": "columns_changed",
            "title": "Kind",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id"
        ],
        "title": "TableColumnsChangedEventSchema",
        "type": "object"
      },
      "TableColumnsWatermarkSchema": {
        "description": "The columns change watermark: column count plus newest column write.",
        "properties": {
          "count": {
            "description": "Number of columns in the table.",
            "title": "Count",
            "type": "integer"
          },
          "max_updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Newest column updated_at; null when the table has no columns. Moves on create, rename, definition change, and reorder; deletes move `count`. Compare for inequality, never ordering.",
            "title": "Max Updated At"
          }
        },
        "required": [
          "count",
          "max_updated_at"
        ],
        "title": "TableColumnsWatermarkSchema",
        "type": "object"
      },
      "TableCompanyDomain-Input": {
        "description": "Reduce a company's website URL to the company's own registrable domain.\n\nThree differences from ``url_domain``, which stays the generic read (a\ncolumn of LinkedIn profile URLs legitimately reduces to ``linkedin.com``\nthere):\n\nHosts that name a platform rather than the company (LinkedIn and Facebook\npages, link aggregators, review sites, vendor partner directories) come out\nempty. A company whose only listed website is its LinkedIn page has no\nderivable domain, and an empty cell says so; ``linkedin.com`` is worse than\nempty because it joins, dedupes and syncs as if it were real.\n\nThe result is the domain someone REGISTERED, not the bare host: a provider\nthat lists ``careers.acme.com`` is describing ``acme.com``. A subdomain\njoins against nothing and sends an agent somewhere that often does not\nresolve. Page builders that give each customer their own label are the\nexception the Public Suffix List already encodes, so ``acme.wixsite.com``\nsurvives whole rather than collapsing into ``wixsite.com``.\n\n``company_name`` guards the case those two cannot: a directory listing\nreduces to the DIRECTORY owner's domain, so\n``cloudpartners.transform.microsoft.com`` becomes ``microsoft.com``: right\nshape, wrong company, and nothing downstream can tell. Pointed at the\ncolumn naming the employer, the domain is dropped when the two disagree.\nOptional: without it the other two rules still apply.",
        "properties": {
          "company_name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Name"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "company_domain",
            "default": "company_domain",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableCompanyDomain",
        "type": "object"
      },
      "TableCompanyDomain-Output": {
        "description": "Reduce a company's website URL to the company's own registrable domain.\n\nThree differences from ``url_domain``, which stays the generic read (a\ncolumn of LinkedIn profile URLs legitimately reduces to ``linkedin.com``\nthere):\n\nHosts that name a platform rather than the company (LinkedIn and Facebook\npages, link aggregators, review sites, vendor partner directories) come out\nempty. A company whose only listed website is its LinkedIn page has no\nderivable domain, and an empty cell says so; ``linkedin.com`` is worse than\nempty because it joins, dedupes and syncs as if it were real.\n\nThe result is the domain someone REGISTERED, not the bare host: a provider\nthat lists ``careers.acme.com`` is describing ``acme.com``. A subdomain\njoins against nothing and sends an agent somewhere that often does not\nresolve. Page builders that give each customer their own label are the\nexception the Public Suffix List already encodes, so ``acme.wixsite.com``\nsurvives whole rather than collapsing into ``wixsite.com``.\n\n``company_name`` guards the case those two cannot: a directory listing\nreduces to the DIRECTORY owner's domain, so\n``cloudpartners.transform.microsoft.com`` becomes ``microsoft.com``: right\nshape, wrong company, and nothing downstream can tell. Pointed at the\ncolumn naming the employer, the domain is dropped when the two disagree.\nOptional: without it the other two rules still apply.",
        "properties": {
          "company_name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company Name"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "company_domain",
            "default": "company_domain",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableCompanyDomain",
        "type": "object"
      },
      "TableConcatenate-Input": {
        "description": "Join several values into one string.\n\nSources are ORDERED and may mix columns with the results of earlier steps:\n``[First name, step 2]`` and ``[step 2, First name]`` are different strings,\nwhich is why there is one list rather than a list of columns beside a list\nof steps.\n\nThe field keeps its original name: every stored definition holds\n``source_column_ids``, and the list is still overwhelmingly columns. Only\nthe item type widened, so old definitions validate untouched.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "concatenate",
            "default": "concatenate",
            "title": "Function",
            "type": "string"
          },
          "ignore_empty": {
            "default": true,
            "title": "Ignore Empty",
            "type": "boolean"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "separator": {
            "default": " ",
            "title": "Separator",
            "type": "string"
          },
          "source_column_ids": {
            "description": "Values to join, in order. A UUID reads that column on the row; a step reference reads an earlier step's output.",
            "items": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "$ref": "#/components/schemas/StepRef"
                }
              ]
            },
            "title": "Source Column Ids",
            "type": "array"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "source_column_ids"
        ],
        "title": "TableConcatenate",
        "type": "object"
      },
      "TableConcatenate-Output": {
        "description": "Join several values into one string.\n\nSources are ORDERED and may mix columns with the results of earlier steps:\n``[First name, step 2]`` and ``[step 2, First name]`` are different strings,\nwhich is why there is one list rather than a list of columns beside a list\nof steps.\n\nThe field keeps its original name: every stored definition holds\n``source_column_ids``, and the list is still overwhelmingly columns. Only\nthe item type widened, so old definitions validate untouched.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "concatenate",
            "default": "concatenate",
            "title": "Function",
            "type": "string"
          },
          "ignore_empty": {
            "default": true,
            "title": "Ignore Empty",
            "type": "boolean"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "separator": {
            "default": " ",
            "title": "Separator",
            "type": "string"
          },
          "source_column_ids": {
            "description": "Values to join, in order. A UUID reads that column on the row; a step reference reads an earlier step's output.",
            "items": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "$ref": "#/components/schemas/StepRef"
                }
              ]
            },
            "title": "Source Column Ids",
            "type": "array"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "source_column_ids"
        ],
        "title": "TableConcatenate",
        "type": "object"
      },
      "TableConditions-Input": {
        "description": "Fold several comparisons into ONE boolean.\n\nThe engine's only boolean combinator, and the shape a column's\n``run_condition`` is authored in: \"only run where Employees > 50 AND\nCountry is US\". Nothing else here joins predicates: ``if_then_else``\ncompares exactly one pair and returns a value rather than a verdict. So\nwithout this a multi-clause gate could only be reached by chaining steps\nthat pipe a truthy stand-in forward, which no editor could read back.\n\nOne joiner over clauses and, at most one level down, groups of clauses:\n\"A and (B or C)\". That is precisely the row filter's shape, so a view's\nfilter can be saved as a gate and read back as a filter without loss; a\ndeeper tree would be expressible on one side only. Reads its clauses'\noperands directly and ignores the piped input, so it is a leaf rather\nthan a transform.",
        "properties": {
          "clauses": {
            "items": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/GateClause"
                },
                {
                  "$ref": "#/components/schemas/GateGroup-Input"
                }
              ]
            },
            "maxItems": 8,
            "minItems": 1,
            "title": "Clauses",
            "type": "array"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "conditions",
            "default": "conditions",
            "title": "Function",
            "type": "string"
          },
          "joiner": {
            "default": "and",
            "enum": [
              "and",
              "or"
            ],
            "title": "Joiner",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "clauses"
        ],
        "title": "TableConditions",
        "type": "object"
      },
      "TableConditions-Output": {
        "description": "Fold several comparisons into ONE boolean.\n\nThe engine's only boolean combinator, and the shape a column's\n``run_condition`` is authored in: \"only run where Employees > 50 AND\nCountry is US\". Nothing else here joins predicates: ``if_then_else``\ncompares exactly one pair and returns a value rather than a verdict. So\nwithout this a multi-clause gate could only be reached by chaining steps\nthat pipe a truthy stand-in forward, which no editor could read back.\n\nOne joiner over clauses and, at most one level down, groups of clauses:\n\"A and (B or C)\". That is precisely the row filter's shape, so a view's\nfilter can be saved as a gate and read back as a filter without loss; a\ndeeper tree would be expressible on one side only. Reads its clauses'\noperands directly and ignores the piped input, so it is a leaf rather\nthan a transform.",
        "properties": {
          "clauses": {
            "items": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/GateClause"
                },
                {
                  "$ref": "#/components/schemas/GateGroup-Output"
                }
              ]
            },
            "maxItems": 8,
            "minItems": 1,
            "title": "Clauses",
            "type": "array"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "conditions",
            "default": "conditions",
            "title": "Function",
            "type": "string"
          },
          "joiner": {
            "default": "and",
            "enum": [
              "and",
              "or"
            ],
            "title": "Joiner",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "clauses"
        ],
        "title": "TableConditions",
        "type": "object"
      },
      "TableCopy-Input": {
        "description": "Copy the input value unchanged.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "copy",
            "default": "copy",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableCopy",
        "type": "object"
      },
      "TableCopy-Output": {
        "description": "Copy the input value unchanged.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "copy",
            "default": "copy",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableCopy",
        "type": "object"
      },
      "TableCountSchema": {
        "description": "The number of matching tables, and the window `untouched` counts by.",
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          },
          "untouched_after_days": {
            "description": "How long a table goes with nobody opening or changing it before `untouched` counts it (60 days by default): the window the Tables list names. The same on every answer, whatever the filters.",
            "title": "Untouched After Days",
            "type": "integer"
          }
        },
        "required": [
          "count",
          "untouched_after_days"
        ],
        "title": "TableCountSchema",
        "type": "object"
      },
      "TableCreateKind": {
        "description": "What a new table is made from.",
        "enum": [
          "blank",
          "lead_search",
          "source"
        ],
        "title": "TableCreateKind",
        "type": "string"
      },
      "TableCreateSchema": {
        "description": "Request body for creating a table: blank, from a lead search, or from a connected tool.\n\n``kind`` says which, and names the part of the body that carries it. A blank\ntable is the default, so a body with a name alone still makes one.",
        "properties": {
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Blank tables only.",
            "title": "Description"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Blank tables only. The folder to make it in, as when somebody makes a table while looking inside one. Leave it out for the top level of the Tables list.",
            "title": "Folder Id"
          },
          "kind": {
            "$ref": "#/components/schemas/TableCreateKind",
            "default": "blank",
            "description": "blank makes an empty table from name, description and folder_id. lead_search runs the search in lead_search and lands its results in the new table. source imports from the connected tool in source."
          },
          "lead_search": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CreateTableFromLeadSearchRequestSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "With kind lead_search: the search, how many of its matches to add, what to find out about them, and the new table's name and folder."
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Blank tables only. Table name, unique per organisation. Leave it out for a blank table: the server names it \"New table\", or \"New table (2)\" and onward when that name is taken, checked against every table in the workspace.",
            "title": "Name"
          },
          "source": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CreateTableFromSourceRequestSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "With kind source: the connected tool and record type to import, and the new table's name and folder."
          }
        },
        "title": "TableCreateSchema",
        "type": "object"
      },
      "TableCreatedSchema": {
        "description": "The table a create made, with what the kind of create reports besides.",
        "properties": {
          "ai_made": {
            "default": false,
            "description": "Whether the AI Assistant created this table through a granted action. The owner is still the person who approved it.",
            "title": "Ai Made",
            "type": "boolean"
          },
          "archived_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When somebody archived it; null for a table on the list. An archived table is left out of All, its folder, Favorites and Recent, and still found by search and opened as before.",
            "title": "Archived At"
          },
          "auto_run": {
            "description": "Whether data changes request recompute runs by themselves. Column-definition changes always recompute.",
            "title": "Auto Run",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "deleted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the table was moved to trash; null for a live table.",
            "title": "Deleted At"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder it sits in; null for the top level.",
            "title": "Folder Id"
          },
          "folder_path": {
            "description": "The folders on the way to it, from the top level down; empty at the top level. What the list says under a search result and the table's own breadcrumb shows.",
            "items": {
              "$ref": "#/components/schemas/TableFolderCrumbSchema"
            },
            "title": "Folder Path",
            "type": "array"
          },
          "former_tags": {
            "description": "The tags it carried when folders replaced tags, when it carried more than one and so waits for somebody to file it. Empty once it is filed.",
            "items": {
              "type": "string"
            },
            "title": "Former Tags",
            "type": "array"
          },
          "has_import_source": {
            "description": "Whether a connected tool's records are imported into this table: the tool and its refresh are the table's source (`GET /tables/{table_id}/source/`).",
            "title": "Has Import Source",
            "type": "boolean"
          },
          "has_lead_search": {
            "description": "Whether a lead search fills this table: its criteria are the table's lead search (`GET /tables/{table_id}/lead-search/`). False for a table typed by hand, loaded from a file or fed by a connected tool, and for one whose search reads a dataset no longer offered.",
            "title": "Has Lead Search",
            "type": "boolean"
          },
          "has_subdomain_feed": {
            "description": "Whether a subdomain search made this table, so it reads that domain again to add new subdomains, by hand or on the table's refresh schedule (`GET /tables/{table_id}/subdomain-feed/`).",
            "title": "Has Subdomain Feed",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_favorite": {
            "default": false,
            "description": "Whether the CALLING USER starred this table. Per-user, so a teammate may see a different value. Always false for API-key callers, which have no user to have preferences.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "keep_existing_results": {
            "description": "Whether a manual run-all only fills the errored, empty and stale cells rather than recomputing every cell in scope.",
            "title": "Keep Existing Results",
            "type": "boolean"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the calling user last opened this table; null means never.",
            "title": "Last Viewed At"
          },
          "lead_search": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CreateTableFromLeadSearchResponseSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "With kind lead_search: what the search landed, and what it cost to find."
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "owner_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The owner's name, resolved for display. Null when there is no owner or the account has no name to show.",
            "title": "Owner Display Name"
          },
          "owner_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who created the table. Null for tables older than this field and for anything a background job created. NOT an access control: every member of the organisation can open and edit every table.",
            "title": "Owner User Id"
          },
          "row_count": {
            "description": "Exact row count, maintained atomically by row mutations.",
            "title": "Row Count",
            "type": "integer"
          },
          "shared_as_template": {
            "default": false,
            "description": "Whether this table's shape is readable by anyone with the link, with no sign-in. Never its rows.",
            "title": "Shared As Template",
            "type": "boolean"
          },
          "source": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableSourceSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "With kind source: the connected tool the rows come from."
          },
          "source_run": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableSourceRunSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "With kind source: the first import, loading rows in the background. Follow it with the table's source runs."
          },
          "table_type": {
            "$ref": "#/components/schemas/TableType",
            "default": "other",
            "description": "What one row stands for: person, company or other. Other for a table made by hand, loaded from a file or fed by a connected tool, until somebody sets it; a lead search for people or companies sets it when it fills the table. A company table offers Find people at its companies."
          },
          "table_type_set_by_search": {
            "default": false,
            "description": "Whether a lead search for people or companies fills this table, so `table_type` is the search's to say and an update that changes it is refused.",
            "title": "Table Type Set By Search",
            "type": "boolean"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "row_count",
          "auto_run",
          "keep_existing_results",
          "created_at",
          "updated_at",
          "has_lead_search",
          "has_import_source",
          "has_subdomain_feed"
        ],
        "title": "TableCreatedSchema",
        "type": "object"
      },
      "TableDateArithmetic-Input": {
        "description": "Add or subtract a fixed duration from a date value.",
        "properties": {
          "amount": {
            "title": "Amount",
            "type": "integer"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "date_arithmetic",
            "default": "date_arithmetic",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "operator": {
            "enum": [
              "add",
              "subtract"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "unit": {
            "enum": [
              "days",
              "hours",
              "minutes",
              "seconds"
            ],
            "title": "Unit",
            "type": "string"
          }
        },
        "required": [
          "operator",
          "amount",
          "unit"
        ],
        "title": "TableDateArithmetic",
        "type": "object"
      },
      "TableDateArithmetic-Output": {
        "description": "Add or subtract a fixed duration from a date value.",
        "properties": {
          "amount": {
            "title": "Amount",
            "type": "integer"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "date_arithmetic",
            "default": "date_arithmetic",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "operator": {
            "enum": [
              "add",
              "subtract"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "unit": {
            "enum": [
              "days",
              "hours",
              "minutes",
              "seconds"
            ],
            "title": "Unit",
            "type": "string"
          }
        },
        "required": [
          "operator",
          "amount",
          "unit"
        ],
        "title": "TableDateArithmetic",
        "type": "object"
      },
      "TableDateDiff-Input": {
        "description": "The signed duration between this step's date and another date.\n\n``date_arithmetic`` shifts a date by a CONSTANT amount, so the gap between\ntwo date columns had no expression. Positive when the step's own date is\nthe later of the two.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "date_diff",
            "default": "date_diff",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "other": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Other"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "unit": {
            "default": "days",
            "enum": [
              "days",
              "hours",
              "minutes",
              "seconds"
            ],
            "title": "Unit",
            "type": "string"
          }
        },
        "title": "TableDateDiff",
        "type": "object"
      },
      "TableDateDiff-Output": {
        "description": "The signed duration between this step's date and another date.\n\n``date_arithmetic`` shifts a date by a CONSTANT amount, so the gap between\ntwo date columns had no expression. Positive when the step's own date is\nthe later of the two.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "date_diff",
            "default": "date_diff",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "other": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Other"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "unit": {
            "default": "days",
            "enum": [
              "days",
              "hours",
              "minutes",
              "seconds"
            ],
            "title": "Unit",
            "type": "string"
          }
        },
        "title": "TableDateDiff",
        "type": "object"
      },
      "TableDateExtract-Input": {
        "description": "Extract a component (year, month, ...) from a date value.",
        "properties": {
          "component": {
            "enum": [
              "year",
              "month",
              "day",
              "hour",
              "minute",
              "second"
            ],
            "title": "Component",
            "type": "string"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "date_extract",
            "default": "date_extract",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "component"
        ],
        "title": "TableDateExtract",
        "type": "object"
      },
      "TableDateExtract-Output": {
        "description": "Extract a component (year, month, ...) from a date value.",
        "properties": {
          "component": {
            "enum": [
              "year",
              "month",
              "day",
              "hour",
              "minute",
              "second"
            ],
            "title": "Component",
            "type": "string"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "date_extract",
            "default": "date_extract",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "component"
        ],
        "title": "TableDateExtract",
        "type": "object"
      },
      "TableDateFormat-Input": {
        "description": "Convert a date between iso/unix/unix_ms representations.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "date_format",
            "default": "date_format",
            "title": "Function",
            "type": "string"
          },
          "input_format": {
            "enum": [
              "iso",
              "unix",
              "unix_ms"
            ],
            "title": "Input Format",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "output_format": {
            "enum": [
              "iso",
              "unix",
              "unix_ms"
            ],
            "title": "Output Format",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "input_format",
          "output_format"
        ],
        "title": "TableDateFormat",
        "type": "object"
      },
      "TableDateFormat-Output": {
        "description": "Convert a date between iso/unix/unix_ms representations.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "date_format",
            "default": "date_format",
            "title": "Function",
            "type": "string"
          },
          "input_format": {
            "enum": [
              "iso",
              "unix",
              "unix_ms"
            ],
            "title": "Input Format",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "output_format": {
            "enum": [
              "iso",
              "unix",
              "unix_ms"
            ],
            "title": "Output Format",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "input_format",
          "output_format"
        ],
        "title": "TableDateFormat",
        "type": "object"
      },
      "TableDeletedEventSchema": {
        "description": "The table was deleted; the next read will 404.",
        "properties": {
          "kind": {
            "const": "table_deleted",
            "default": "table_deleted",
            "title": "Kind",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id"
        ],
        "title": "TableDeletedEventSchema",
        "type": "object"
      },
      "TableDescriptionSuggestionSchema": {
        "description": "A generated description for a table, for the user to accept or edit.",
        "properties": {
          "description": {
            "description": "A one- or two-sentence description of what the table holds, written from its column names and types. Never applied automatically: the caller puts it in the field and the user decides.",
            "title": "Description",
            "type": "string"
          }
        },
        "required": [
          "description"
        ],
        "title": "TableDescriptionSuggestionSchema",
        "type": "object"
      },
      "TableDetectLanguage-Input": {
        "description": "The language a piece of text is written in, as an ISO 639-1 code.\n\nRoutes a row before anything expensive touches it: which sequence to\nenrol a lead into, which reviewer sees a scraped page, whether to\ntranslate at all.\n\nScript comes first (Cyrillic, Greek, Hebrew, Arabic, Han, kana and\nhangul each answer on their own) and Latin text is decided by the\nfunction words it uses. That is a heuristic, not a model: it is\ndeterministic, free, and honest about not knowing, returning null when\nthe text is too short or matches nothing.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "detect_language",
            "default": "detect_language",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableDetectLanguage",
        "type": "object"
      },
      "TableDetectLanguage-Output": {
        "description": "The language a piece of text is written in, as an ISO 639-1 code.\n\nRoutes a row before anything expensive touches it: which sequence to\nenrol a lead into, which reviewer sees a scraped page, whether to\ntranslate at all.\n\nScript comes first (Cyrillic, Greek, Hebrew, Arabic, Han, kana and\nhangul each answer on their own) and Latin text is decided by the\nfunction words it uses. That is a heuristic, not a model: it is\ndeterministic, free, and honest about not knowing, returning null when\nthe text is too short or matches nothing.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "detect_language",
            "default": "detect_language",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableDetectLanguage",
        "type": "object"
      },
      "TableDuplicateRequestSchema": {
        "description": "Request body for duplicating a table.",
        "properties": {
          "include_rows": {
            "default": true,
            "description": "Copy rows and cell values too. Off duplicates the structure alone: columns, types, formulas, display preferences.",
            "title": "Include Rows",
            "type": "boolean"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The duplicate's name; omitted derives \"<source> copy\", suffixed until free.",
            "title": "Name"
          }
        },
        "title": "TableDuplicateRequestSchema",
        "type": "object"
      },
      "TableDuplicatedSchema": {
        "description": "The table a duplicate made, with the columns it left out.",
        "properties": {
          "ai_made": {
            "default": false,
            "description": "Whether the AI Assistant created this table through a granted action. The owner is still the person who approved it.",
            "title": "Ai Made",
            "type": "boolean"
          },
          "archived_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When somebody archived it; null for a table on the list. An archived table is left out of All, its folder, Favorites and Recent, and still found by search and opened as before.",
            "title": "Archived At"
          },
          "auto_run": {
            "description": "Whether data changes request recompute runs by themselves. Column-definition changes always recompute.",
            "title": "Auto Run",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "deleted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the table was moved to trash; null for a live table.",
            "title": "Deleted At"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder it sits in; null for the top level.",
            "title": "Folder Id"
          },
          "folder_path": {
            "description": "The folders on the way to it, from the top level down; empty at the top level. What the list says under a search result and the table's own breadcrumb shows.",
            "items": {
              "$ref": "#/components/schemas/TableFolderCrumbSchema"
            },
            "title": "Folder Path",
            "type": "array"
          },
          "former_tags": {
            "description": "The tags it carried when folders replaced tags, when it carried more than one and so waits for somebody to file it. Empty once it is filed.",
            "items": {
              "type": "string"
            },
            "title": "Former Tags",
            "type": "array"
          },
          "has_import_source": {
            "description": "Whether a connected tool's records are imported into this table: the tool and its refresh are the table's source (`GET /tables/{table_id}/source/`).",
            "title": "Has Import Source",
            "type": "boolean"
          },
          "has_lead_search": {
            "description": "Whether a lead search fills this table: its criteria are the table's lead search (`GET /tables/{table_id}/lead-search/`). False for a table typed by hand, loaded from a file or fed by a connected tool, and for one whose search reads a dataset no longer offered.",
            "title": "Has Lead Search",
            "type": "boolean"
          },
          "has_subdomain_feed": {
            "description": "Whether a subdomain search made this table, so it reads that domain again to add new subdomains, by hand or on the table's refresh schedule (`GET /tables/{table_id}/subdomain-feed/`).",
            "title": "Has Subdomain Feed",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_favorite": {
            "default": false,
            "description": "Whether the CALLING USER starred this table. Per-user, so a teammate may see a different value. Always false for API-key callers, which have no user to have preferences.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "keep_existing_results": {
            "description": "Whether a manual run-all only fills the errored, empty and stale cells rather than recomputing every cell in scope.",
            "title": "Keep Existing Results",
            "type": "boolean"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the calling user last opened this table; null means never.",
            "title": "Last Viewed At"
          },
          "left_out_column_names": {
            "description": "The source's sequence columns, and every column reading one, in table order. A duplicate leaves them out: they hold the live enrolment of rows in a sequence, and no copied row is in one. Empty when the source has none.",
            "items": {
              "type": "string"
            },
            "title": "Left Out Column Names",
            "type": "array"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "owner_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The owner's name, resolved for display. Null when there is no owner or the account has no name to show.",
            "title": "Owner Display Name"
          },
          "owner_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who created the table. Null for tables older than this field and for anything a background job created. NOT an access control: every member of the organisation can open and edit every table.",
            "title": "Owner User Id"
          },
          "row_count": {
            "description": "Exact row count, maintained atomically by row mutations.",
            "title": "Row Count",
            "type": "integer"
          },
          "shared_as_template": {
            "default": false,
            "description": "Whether this table's shape is readable by anyone with the link, with no sign-in. Never its rows.",
            "title": "Shared As Template",
            "type": "boolean"
          },
          "table_type": {
            "$ref": "#/components/schemas/TableType",
            "default": "other",
            "description": "What one row stands for: person, company or other. Other for a table made by hand, loaded from a file or fed by a connected tool, until somebody sets it; a lead search for people or companies sets it when it fills the table. A company table offers Find people at its companies."
          },
          "table_type_set_by_search": {
            "default": false,
            "description": "Whether a lead search for people or companies fills this table, so `table_type` is the search's to say and an update that changes it is refused.",
            "title": "Table Type Set By Search",
            "type": "boolean"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "row_count",
          "auto_run",
          "keep_existing_results",
          "created_at",
          "updated_at",
          "has_lead_search",
          "has_import_source",
          "has_subdomain_feed"
        ],
        "title": "TableDuplicatedSchema",
        "type": "object"
      },
      "TableEmailPermutations-Input": {
        "description": "The candidate work-email addresses for a name at a domain.\n\nWhat a verifier needs to be pointed at: nine or so patterns companies\nactually use, in the order they are actually common, so the cheapest\nverification step has a list to work through instead of one guess.\n\nThe piped value is the person's name: \"Ada Lovelace\", or a first name\nwith ``last_name`` supplying the rest. Anything after the first and last\ntoken (middle names, suffixes) is ignored rather than permuted, which is\nwhat keeps the list nine long instead of ninety.",
        "properties": {
          "domain": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Domain"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "email_permutations",
            "default": "email_permutations",
            "title": "Function",
            "type": "string"
          },
          "last_name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Name"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableEmailPermutations",
        "type": "object"
      },
      "TableEmailPermutations-Output": {
        "description": "The candidate work-email addresses for a name at a domain.\n\nWhat a verifier needs to be pointed at: nine or so patterns companies\nactually use, in the order they are actually common, so the cheapest\nverification step has a list to work through instead of one guess.\n\nThe piped value is the person's name: \"Ada Lovelace\", or a first name\nwith ``last_name`` supplying the rest. Anything after the first and last\ntoken (middle names, suffixes) is ignored rather than permuted, which is\nwhat keeps the list nine long instead of ninety.",
        "properties": {
          "domain": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Domain"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "email_permutations",
            "default": "email_permutations",
            "title": "Function",
            "type": "string"
          },
          "last_name": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Name"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableEmailPermutations",
        "type": "object"
      },
      "TableEnrichmentAuditAction": {
        "description": "Action types for enrichment audit logs.\n\nBeyond the usual created/updated pair, enrichment actions spend\norganisational money, so run requests, cancellations and the settled\ncost each get their own entry.",
        "enum": [
          "configured",
          "edited",
          "run_requested",
          "run_cancelled",
          "cost_incurred",
          "assistant_applied",
          "assistant_undone"
        ],
        "title": "TableEnrichmentAuditAction",
        "type": "string"
      },
      "TableExportFormat": {
        "description": "The file a table export is downloaded as.\n\nThe two differ in more than their extension. A CSV is text, so every value\nbecomes a string and free text is defanged against a spreadsheet reading a\nleading \"=\" as a formula. A workbook keeps native types, so a number stays\nsummable and a date sorts as a date, and no defanging is needed because a\nstring cell is never evaluated.",
        "enum": [
          "csv",
          "xlsx"
        ],
        "title": "TableExportFormat",
        "type": "string"
      },
      "TableExportRequestSchema": {
        "description": "Request body for a table file export.\n\nTwo scopes, one body. Send ``sorts``/``where`` to export what the grid is\ncurrently showing, in the same vocabulary the rows query accepts, so a\nfiltered view exports exactly the rows the user can see. Send ``record_ids``\nto export a specific selection instead. The two are mutually exclusive: an\nenumerated selection has already answered the question a filter asks.\n\n``column_ids`` is the projection, in display order, so hiding or reordering\na column in the grid is reflected in the file.\n\n``format`` picks the file. It defaults to CSV, so a client written before\nExcel existed keeps working untouched.",
        "properties": {
          "column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 500,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Export these columns, in this order. Omit for every column, in the table's own column order.",
            "title": "Column Ids"
          },
          "except_record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Leave these rows out of a selection of every matching row: the rows unticked after Select all. At most 1000.",
            "title": "Except Record Ids"
          },
          "format": {
            "$ref": "#/components/schemas/TableExportFormat",
            "default": "csv",
            "description": "The file to download. `csv` writes every value as text. `xlsx` keeps native types, so numbers stay summable and dates sort as dates."
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 10000,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Export exactly these rows, in display order. Mutually exclusive with `sorts`, `where` and `except_record_ids`.",
            "title": "Record Ids"
          },
          "sorts": {
            "description": "Order rows by these columns instead of the display order.",
            "items": {
              "$ref": "#/components/schemas/TableRowSortSchema"
            },
            "maxItems": 3,
            "title": "Sorts",
            "type": "array"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "Export only rows satisfying this predicate tree."
          }
        },
        "title": "TableExportRequestSchema",
        "type": "object"
      },
      "TableFailureMode": {
        "description": "What a formula cell resolves to when a step in its chain fails.\n\nApplies to the whole chain, read off the top-level function only.\n``SKIP`` is equivalent to ``SET_NULL`` for table cells (a cell always has a\nstored slot, so there is nothing to skip). Kept for shape compatibility.",
        "enum": [
          "pass_through_raw",
          "set_null",
          "static",
          "skip"
        ],
        "title": "TableFailureMode",
        "type": "string"
      },
      "TableFilterJoiner": {
        "description": "How the members of one filter level combine.",
        "enum": [
          "and",
          "or"
        ],
        "title": "TableFilterJoiner",
        "type": "string"
      },
      "TableFilterOperator": {
        "description": "A row filter predicate.\n\nWhich operators are legal depends on the column's data type; the service\nvalidates the pairing and rejects a mismatch, so an operator here is a\nvocabulary entry rather than a promise it applies everywhere.\n\nTwo families live here. The VALUE operators ask about what a cell holds and\nare keyed off the column's storage slot. The STATE operators ask about what\nthe last run DID to the cell (errored, skipped, never ran, went stale) and\nare keyed off the column's kind instead: they read the compute metadata that\nonly a computed column ever writes, and mean nothing on a hand-typed one.",
        "enum": [
          "eq",
          "neq",
          "gt",
          "gte",
          "lt",
          "lte",
          "contains",
          "not_contains",
          "contains_any_of",
          "not_contains_any_of",
          "starts_with",
          "is_true",
          "is_false",
          "is_empty",
          "is_not_empty",
          "has_error",
          "has_no_error",
          "has_results",
          "has_no_results",
          "has_not_run",
          "is_stale",
          "is_not_stale",
          "run_condition_not_met",
          "run_stopped"
        ],
        "title": "TableFilterOperator",
        "type": "string"
      },
      "TableFolderCreateSchema": {
        "description": "Request body for making a folder.",
        "properties": {
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder's name. Leave it out for \"Untitled folder\", numbered when the place already has one.",
            "title": "Name"
          },
          "parent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder to make it in; null for the top level.",
            "title": "Parent Id"
          }
        },
        "title": "TableFolderCreateSchema",
        "type": "object"
      },
      "TableFolderCrumbSchema": {
        "description": "One folder on the way to a table, from the top level down.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "TableFolderCrumbSchema",
        "type": "object"
      },
      "TableFolderDeletedResponseSchema": {
        "description": "What deleting a folder, to Trash or for good, took with it.",
        "properties": {
          "count": {
            "default": 1,
            "description": "The folders that went: this one and every folder in it.",
            "title": "Count",
            "type": "integer"
          },
          "detail": {
            "description": "The detail of why the resource was deleted.",
            "title": "Detail",
            "type": "string"
          },
          "table_ids": {
            "description": "The tables that went with it: to Trash, where they come back with the folder, or for good.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Table Ids",
            "type": "array"
          }
        },
        "required": [
          "detail"
        ],
        "title": "TableFolderDeletedResponseSchema",
        "type": "object"
      },
      "TableFolderSchema": {
        "description": "A workspace folder, as the Tables list draws it.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "deleted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it was moved to Trash; null for a live folder. In Trash, table_count is the tables that went with it and come back with it.",
            "title": "Deleted At"
          },
          "folder_count": {
            "default": 0,
            "description": "Folders directly in it.",
            "title": "Folder Count",
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the CALLING USER last opened any table in it, at any depth; null when they never have.",
            "title": "Last Viewed At"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "nested_archived_count": {
            "default": 0,
            "description": "Archived tables in it at any depth, which go to Trash with it too.",
            "title": "Nested Archived Count",
            "type": "integer"
          },
          "nested_table_count": {
            "default": 0,
            "description": "Tables in it at any depth, archived ones aside. What deleting it would send to Trash, archived tables added.",
            "title": "Nested Table Count",
            "type": "integer"
          },
          "owner_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The owner's name, resolved for display.",
            "title": "Owner Display Name"
          },
          "owner_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who to ask about it: whoever made it, unless somebody changed it.",
            "title": "Owner User Id"
          },
          "parent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder it sits in; null for the top level.",
            "title": "Parent Id"
          },
          "table_count": {
            "default": 0,
            "description": "Tables directly in it, archived ones aside.",
            "title": "Table Count",
            "type": "integer"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "parent_id",
          "owner_user_id",
          "created_at",
          "updated_at"
        ],
        "title": "TableFolderSchema",
        "type": "object"
      },
      "TableFolderSuggestionReason": {
        "description": "Why a few loose tables look like they belong in one folder.",
        "enum": [
          "built_from",
          "campaign_code",
          "shared_name"
        ],
        "title": "TableFolderSuggestionReason",
        "type": "string"
      },
      "TableFolderSuggestionSchema": {
        "description": "A folder a few tables in no folder look like they belong in.",
        "properties": {
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "A folder of that name already at the top level, to file them in; null when accepting makes it.",
            "title": "Folder Id"
          },
          "name": {
            "description": "The folder's name: the one to make, or the one there.",
            "title": "Name",
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/TableFolderSuggestionReason",
            "description": "built_from: one table's lead search reads its companies from another. campaign_code: their names end in the same code, as in (EF-1). shared_name: their names start the same, up to a dash."
          },
          "tables": {
            "description": "The tables it would file, two or more, by name.",
            "items": {
              "$ref": "#/components/schemas/TableFolderSuggestionTableSchema"
            },
            "title": "Tables",
            "type": "array"
          }
        },
        "required": [
          "name",
          "folder_id",
          "reason",
          "tables"
        ],
        "title": "TableFolderSuggestionSchema",
        "type": "object"
      },
      "TableFolderSuggestionTableSchema": {
        "description": "A table a folder suggestion would file.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "TableFolderSuggestionTableSchema",
        "type": "object"
      },
      "TableFolderSuggestionsSchema": {
        "description": "The folders the tables in no folder suggest.",
        "properties": {
          "data": {
            "description": "Biggest first, then by name. Each table is in one suggestion at most.",
            "items": {
              "$ref": "#/components/schemas/TableFolderSuggestionSchema"
            },
            "title": "Data",
            "type": "array"
          },
          "loose_table_count": {
            "description": "Tables on the list in no folder, archived ones aside.",
            "title": "Loose Table Count",
            "type": "integer"
          }
        },
        "required": [
          "data",
          "loose_table_count"
        ],
        "title": "TableFolderSuggestionsSchema",
        "type": "object"
      },
      "TableFolderTrashResultSchema": {
        "description": "What restoring a folder moved.",
        "properties": {
          "folder": {
            "$ref": "#/components/schemas/TableFolderSchema"
          },
          "folder_count": {
            "description": "Folders that moved, this one included.",
            "title": "Folder Count",
            "type": "integer"
          },
          "left_in_trash_table_ids": {
            "description": "On a restore: tables that stayed in Trash because a live table has taken their name since. Each is now listed in Trash on its own.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Left In Trash Table Ids",
            "type": "array"
          },
          "table_ids": {
            "description": "Tables that moved with it.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Table Ids",
            "type": "array"
          }
        },
        "required": [
          "folder",
          "folder_count",
          "table_ids"
        ],
        "title": "TableFolderTrashResultSchema",
        "type": "object"
      },
      "TableFolderUpdateSchema": {
        "description": "Request body for renaming, moving or re-owning a folder (omitted fields stay).",
        "properties": {
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "description": "Its new name.",
            "title": "Name"
          },
          "owner_user_id": {
            "anyOf": [
              {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The workspace member who owns it from now on; null for no owner.",
            "title": "Owner User Id"
          },
          "parent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "The folder to move it into; null for the top level.",
            "title": "Parent Id"
          }
        },
        "title": "TableFolderUpdateSchema",
        "type": "object"
      },
      "TableFormat-Input": {
        "description": "Build a string from a positional template and a list of arguments.\n\n``concatenate`` joins whole columns with one separator, which cannot\nproduce \"Enterprise: Acme (12.4%)\". Placeholders are positional only\n(``{0}``, ``{1}``) so the template stays data, not an expression language.\n\nLike ``concatenate`` this takes no ``source_column_id``: its inputs are its\narguments, not the value flowing down the chain.",
        "properties": {
          "arguments": {
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ColumnRef"
                },
                {
                  "$ref": "#/components/schemas/StepRef"
                },
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "maxItems": 10,
            "title": "Arguments",
            "type": "array"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "format",
            "default": "format",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "template": {
            "minLength": 1,
            "title": "Template",
            "type": "string"
          }
        },
        "required": [
          "template"
        ],
        "title": "TableFormat",
        "type": "object"
      },
      "TableFormat-Output": {
        "description": "Build a string from a positional template and a list of arguments.\n\n``concatenate`` joins whole columns with one separator, which cannot\nproduce \"Enterprise: Acme (12.4%)\". Placeholders are positional only\n(``{0}``, ``{1}``) so the template stays data, not an expression language.\n\nLike ``concatenate`` this takes no ``source_column_id``: its inputs are its\narguments, not the value flowing down the chain.",
        "properties": {
          "arguments": {
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ColumnRef"
                },
                {
                  "$ref": "#/components/schemas/StepRef"
                },
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "maxItems": 10,
            "title": "Arguments",
            "type": "array"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "format",
            "default": "format",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "template": {
            "minLength": 1,
            "title": "Template",
            "type": "string"
          }
        },
        "required": [
          "template"
        ],
        "title": "TableFormat",
        "type": "object"
      },
      "TableFunctionCategory": {
        "description": "UI grouping for the function catalog.",
        "enum": [
          "string",
          "number",
          "date",
          "list",
          "logic",
          "type_coercion",
          "domain"
        ],
        "title": "TableFunctionCategory",
        "type": "string"
      },
      "TableGetPath-Input": {
        "description": "Read a dotted path out of an object- or list-valued cell.\n\nObject and list columns were storable but unreadable: nothing in the\ncatalog could reach a field inside one, so an enrichment payload landed in\na cell and stopped there. Segments index dicts by key and lists by integer\nposition: ``employees.count``, ``emails.0.address``.\n\n``output_type`` is declared rather than derived because a JSON path can\nland on anything, and the column's data type has to be known before a\nsingle row is evaluated.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "get_path",
            "default": "get_path",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "output_type": {
            "$ref": "#/components/schemas/PropertyType",
            "default": "string"
          },
          "path": {
            "minLength": 1,
            "title": "Path",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "path"
        ],
        "title": "TableGetPath",
        "type": "object"
      },
      "TableGetPath-Output": {
        "description": "Read a dotted path out of an object- or list-valued cell.\n\nObject and list columns were storable but unreadable: nothing in the\ncatalog could reach a field inside one, so an enrichment payload landed in\na cell and stopped there. Segments index dicts by key and lists by integer\nposition: ``employees.count``, ``emails.0.address``.\n\n``output_type`` is declared rather than derived because a JSON path can\nland on anything, and the column's data type has to be known before a\nsingle row is evaluated.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "get_path",
            "default": "get_path",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "output_type": {
            "$ref": "#/components/schemas/PropertyType",
            "default": "string"
          },
          "path": {
            "minLength": 1,
            "title": "Path",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "path"
        ],
        "title": "TableGetPath",
        "type": "object"
      },
      "TableHash-Input": {
        "description": "Hash a value: the identifier ad platforms and clean rooms ask for.\n\nUploading an audience means handing over hashed emails, never raw ones,\nand the hash has to be produced the way the platform specifies:\nlowercased and trimmed first, hex digest out. That normalisation is the\npart people get wrong by hand, so it happens here rather than in three\nchained steps.",
        "properties": {
          "algorithm": {
            "default": "sha256",
            "enum": [
              "sha256",
              "sha1",
              "md5"
            ],
            "title": "Algorithm",
            "type": "string"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "hash",
            "default": "hash",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "normalize": {
            "default": true,
            "description": "Trim and lowercase before hashing, as ad platforms require.",
            "title": "Normalize",
            "type": "boolean"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableHash",
        "type": "object"
      },
      "TableHash-Output": {
        "description": "Hash a value: the identifier ad platforms and clean rooms ask for.\n\nUploading an audience means handing over hashed emails, never raw ones,\nand the hash has to be produced the way the platform specifies:\nlowercased and trimmed first, hex digest out. That normalisation is the\npart people get wrong by hand, so it happens here rather than in three\nchained steps.",
        "properties": {
          "algorithm": {
            "default": "sha256",
            "enum": [
              "sha256",
              "sha1",
              "md5"
            ],
            "title": "Algorithm",
            "type": "string"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "hash",
            "default": "hash",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "normalize": {
            "default": true,
            "description": "Trim and lowercase before hashing, as ad platforms require.",
            "title": "Normalize",
            "type": "boolean"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableHash",
        "type": "object"
      },
      "TableHelloEventSchema": {
        "description": "Opening frame: the stream is live and the client should resync once.",
        "properties": {
          "heartbeat_seconds": {
            "description": "Idle heartbeat cadence; treat silence beyond a small multiple as death.",
            "title": "Heartbeat Seconds",
            "type": "integer"
          },
          "kind": {
            "const": "hello",
            "default": "hello",
            "title": "Kind",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "heartbeat_seconds"
        ],
        "title": "TableHelloEventSchema",
        "type": "object"
      },
      "TableIfThenElse-Input": {
        "description": "Pick one of two values based on a comparison.\n\nEach of the three slots takes a literal or a column, so this expresses both\n\"if this column is over that column\" and \"use A, else use B\". Neither of\nthose was reachable while they were constants.",
        "properties": {
          "compare_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Compare Value"
          },
          "else_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Else Value"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "if_then_else",
            "default": "if_then_else",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "operator": {
            "enum": [
              "eq",
              "neq",
              "gt",
              "lt",
              "gte",
              "lte",
              "contains",
              "not_contains"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "then_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Then Value"
          }
        },
        "required": [
          "operator"
        ],
        "title": "TableIfThenElse",
        "type": "object"
      },
      "TableIfThenElse-Output": {
        "description": "Pick one of two values based on a comparison.\n\nEach of the three slots takes a literal or a column, so this expresses both\n\"if this column is over that column\" and \"use A, else use B\". Neither of\nthose was reachable while they were constants.",
        "properties": {
          "compare_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Compare Value"
          },
          "else_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Else Value"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "if_then_else",
            "default": "if_then_else",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "operator": {
            "enum": [
              "eq",
              "neq",
              "gt",
              "lt",
              "gte",
              "lte",
              "contains",
              "not_contains"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "then_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Then Value"
          }
        },
        "required": [
          "operator"
        ],
        "title": "TableIfThenElse",
        "type": "object"
      },
      "TableImportCommitRequestSchema": {
        "description": "Request body for committing an upload.\n\nSend the mapping the user reviewed. Omitting a field's entry leaves that\ncolumn out of the table entirely, which is how a user drops a column they\ndo not want.",
        "properties": {
          "columns": {
            "description": "The reviewed mapping, in display order.",
            "items": {
              "$ref": "#/components/schemas/ImportColumnMappingSchema"
            },
            "maxItems": 500,
            "minItems": 1,
            "title": "Columns",
            "type": "array"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder to make the table in, as when the file is imported from inside one on the Tables list. Leave it out for the top level.",
            "title": "Folder Id"
          },
          "max_rows": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many of the file's data rows to write, counted from the top: 1 or more. Clamped by the plan's own ceiling, so this can only ever import less than the preview's `importable_row_count`, never more. Omit it, or send null, for every row the plan allows; that is also how a file with a header and no data rows is committed. Named for the user's choice, unlike the preview's `row_limit`, which is the plan's cap.",
            "title": "Max Rows"
          },
          "row_ranges": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/ImportRowRangeSchema"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which of the file's data rows to write, the way a print dialog picks pages: rows 1 to 10 and 21 to 30 are two ranges. Rows are numbered as `row_errors` numbers them, from 1 under the header, blank lines not counted. Overlapping and touching ranges are merged, an end past the file's last row is brought back to it, and a choice bigger than the plan's `row_limit` keeps its first rows up to it. Rows past the preview's `importable_row_count` may be chosen: the plan caps how many rows a table holds, not which. A choice wholly past the end of the file is refused, and so is one of more than 100 ranges once merged. Send this or `max_rows`, never both; omit both for every row the plan allows.",
            "title": "Row Ranges"
          },
          "table_name": {
            "description": "Name for the table this creates.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Table Name",
            "type": "string"
          }
        },
        "required": [
          "table_name",
          "columns"
        ],
        "title": "TableImportCommitRequestSchema",
        "type": "object"
      },
      "TableImportJobResponseSchema": {
        "description": "A CSV import's current state.\n\nPoll this until `status` is terminal. `imported_rows` climbs as the load\nruns, so it doubles as a progress bar against `total_rows`.",
        "properties": {
          "columns": {
            "description": "The mapping in force.",
            "items": {
              "$ref": "#/components/schemas/ImportColumnMappingSchema"
            },
            "title": "Columns",
            "type": "array"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the whole job failed, if it did.",
            "title": "Error"
          },
          "failed_rows": {
            "description": "Rows that could not be written: the exact count.",
            "title": "Failed Rows",
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "imported_rows": {
            "description": "Rows written so far.",
            "title": "Imported Rows",
            "type": "integer"
          },
          "row_errors": {
            "description": "A capped sample of per-row failures; failed_rows carries the full count.",
            "items": {
              "$ref": "#/components/schemas/ImportRowErrorSchema"
            },
            "title": "Row Errors",
            "type": "array"
          },
          "source_filename": {
            "title": "Source Filename",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/TableImportStatus"
          },
          "table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table this created; null before commit.",
            "title": "Table Id"
          },
          "total_rows": {
            "description": "Rows this import will write: the file's rows, capped by the plan and by whatever `max_rows` the commit asked for, or the rows its `row_ranges` hold.",
            "title": "Total Rows",
            "type": "integer"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "status",
          "source_filename",
          "total_rows",
          "imported_rows",
          "failed_rows",
          "error",
          "row_errors",
          "columns",
          "created_at",
          "updated_at"
        ],
        "title": "TableImportJobResponseSchema",
        "type": "object"
      },
      "TableImportPreviewResponseSchema": {
        "description": "What an upload returns: a mapping to review, and enough of the file to judge it.\n\nNothing is created yet: no table, no columns, no rows. Edit the mapping and\nPOST it to the commit endpoint to actually build the table.\n\nWhen `importable_row_count` is below `estimated_row_count` the file is\nlonger than the plan allows and the import will take its first\n`importable_row_count` rows. Say so before the user commits: the two numbers\nare here as numbers, rather than as a sentence in `warnings`, because the\nclient puts its upgrade control beside them.",
        "properties": {
          "columns": {
            "description": "The inferred mapping.",
            "items": {
              "$ref": "#/components/schemas/ImportPreviewColumnSchema"
            },
            "title": "Columns",
            "type": "array"
          },
          "estimated_row_count": {
            "description": "Data rows in the file, excluding the header.",
            "title": "Estimated Row Count",
            "type": "integer"
          },
          "import_id": {
            "description": "Identifies this upload through commit and polling.",
            "format": "uuid",
            "title": "Import Id",
            "type": "string"
          },
          "importable_row_count": {
            "description": "How many of those rows the import will write, once the cap is applied.",
            "title": "Importable Row Count",
            "type": "integer"
          },
          "row_limit": {
            "description": "Rows one table may hold on this organisation's plan.",
            "title": "Row Limit",
            "type": "integer"
          },
          "sample_rows": {
            "description": "Raw sampled rows, in file order.",
            "items": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "title": "Sample Rows",
            "type": "array"
          },
          "selected_sheet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which sheet these columns were read from. Null for a CSV. Send another sheet name as `sheet` when updating the import to re-read the same upload from it.",
            "title": "Selected Sheet"
          },
          "sheet_names": {
            "description": "Every sheet the uploaded workbook offers, in tab order. Empty for a CSV, which has no sheets. That is what says not to offer a sheet picker.",
            "items": {
              "type": "string"
            },
            "title": "Sheet Names",
            "type": "array"
          },
          "warnings": {
            "description": "Non-fatal things the user should see.",
            "items": {
              "type": "string"
            },
            "title": "Warnings",
            "type": "array"
          }
        },
        "required": [
          "import_id",
          "columns",
          "sample_rows",
          "estimated_row_count",
          "importable_row_count",
          "row_limit",
          "warnings"
        ],
        "title": "TableImportPreviewResponseSchema",
        "type": "object"
      },
      "TableImportSheetRequestSchema": {
        "description": "Which sheet of an already-uploaded workbook to read instead.",
        "properties": {
          "sheet": {
            "description": "A sheet name from the preview's `sheet_names`.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Sheet",
            "type": "string"
          }
        },
        "required": [
          "sheet"
        ],
        "title": "TableImportSheetRequestSchema",
        "type": "object"
      },
      "TableImportStatus": {
        "description": "Where a CSV import has got to.\n\n``PENDING`` is a parsed-and-stored upload the user has not committed yet:\nit holds an inferred mapping and nothing else. ``RUNNING`` means the table\nand its columns exist and the row job is inserting. The two terminal states\nare absorbing: a job never leaves them.",
        "enum": [
          "pending",
          "running",
          "succeeded",
          "failed"
        ],
        "title": "TableImportStatus",
        "type": "string"
      },
      "TableKeywords-Input": {
        "description": "The most frequent meaningful words in a text or list value.\n\nReads a body of text (a scraped page, a bio, a job description) and\nreturns the words that carry its subject, ordered most frequent first.\nStopwords (\"the\", \"and\", \"with\") are dropped: a frequency count that keeps\nthem returns the same five words for every row and says nothing about any\nof them.\n\nDeterministic and pure: no model call, so a keyword column costs nothing\nand re-runs identically.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "keywords",
            "default": "keywords",
            "title": "Function",
            "type": "string"
          },
          "limit": {
            "default": 10,
            "description": "How many keywords to keep, most frequent first.",
            "maximum": 100.0,
            "minimum": 1.0,
            "title": "Limit",
            "type": "integer"
          },
          "min_length": {
            "default": 3,
            "description": "Shortest word to consider; anything shorter is noise.",
            "maximum": 20.0,
            "minimum": 1.0,
            "title": "Min Length",
            "type": "integer"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableKeywords",
        "type": "object"
      },
      "TableKeywords-Output": {
        "description": "The most frequent meaningful words in a text or list value.\n\nReads a body of text (a scraped page, a bio, a job description) and\nreturns the words that carry its subject, ordered most frequent first.\nStopwords (\"the\", \"and\", \"with\") are dropped: a frequency count that keeps\nthem returns the same five words for every row and says nothing about any\nof them.\n\nDeterministic and pure: no model call, so a keyword column costs nothing\nand re-runs identically.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "keywords",
            "default": "keywords",
            "title": "Function",
            "type": "string"
          },
          "limit": {
            "default": 10,
            "description": "How many keywords to keep, most frequent first.",
            "maximum": 100.0,
            "minimum": 1.0,
            "title": "Limit",
            "type": "integer"
          },
          "min_length": {
            "default": 3,
            "description": "Shortest word to consider; anything shorter is noise.",
            "maximum": 20.0,
            "minimum": 1.0,
            "title": "Min Length",
            "type": "integer"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableKeywords",
        "type": "object"
      },
      "TableLastViewSchema": {
        "description": "The view one person last left one table on, as its address's query string.",
        "properties": {
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table page's query string (view, sort, filter, a view's hidden columns) with no leading '?'; null when they left it as it opens for anyone.",
            "title": "Address"
          }
        },
        "required": [
          "address"
        ],
        "title": "TableLastViewSchema",
        "type": "object"
      },
      "TableLastViewUpdateSchema": {
        "description": "Request body for keeping, or forgetting, the view a person is leaving a table on.",
        "properties": {
          "address": {
            "anyOf": [
              {
                "maxLength": 16384,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The table page's query string (view, sort, filter, a view's hidden columns) with no leading '?'; null when they left it as it opens for anyone. Null forgets it.",
            "title": "Address"
          }
        },
        "required": [
          "address"
        ],
        "title": "TableLastViewUpdateSchema",
        "type": "object"
      },
      "TableLeadSearchResponseSchema": {
        "description": "A table's lead search as a PUT left it, and the first run when the PUT started one.",
        "properties": {
          "company_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a company search: the table's column of company websites the search landed, which a people search follows as `company_table` to find the people at these companies. Found by what the column reads, so a rename keeps it. Null for any other search, or when that column was deleted.",
            "title": "Company Column Id"
          },
          "first_run": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LeadSearchRunResponseSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the first run added, when the table had no search and this request attached one and ran it. Null when the table already had a search: its criteria were replaced and nothing ran or was charged."
          },
          "max_rows_per_search": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Kept for older screens; null in production. No search has a ceiling on one run of its own: a run is bounded by the plan's rows per table, the search's row limit (or the rows asked for), and where the matches end. A number only where the deployment sets a guard on every search (a local environment). One run with `more_rows` adds no more than the room left in the table.",
            "title": "Max Rows Per Search"
          },
          "next_run_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Run At"
          },
          "query": {
            "additionalProperties": true,
            "title": "Query",
            "type": "object"
          },
          "record_type": {
            "$ref": "#/components/schemas/LeadRecordType"
          },
          "row_limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Row Limit"
          },
          "schedule_at_minutes": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Schedule At Minutes"
          },
          "schedule_cadence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LeadSearchCadence"
              },
              {
                "type": "null"
              }
            ]
          },
          "schedule_every_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Schedule Every Days"
          },
          "schedule_starts_on": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The first day the schedule may run, in its own timezone; null when it started at once.",
            "title": "Schedule Starts On"
          },
          "schedule_timezone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Schedule Timezone"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "record_type",
          "query",
          "row_limit",
          "schedule_cadence",
          "schedule_every_days",
          "schedule_at_minutes",
          "schedule_timezone",
          "next_run_at",
          "updated_at"
        ],
        "title": "TableLeadSearchResponseSchema",
        "type": "object"
      },
      "TableListCount-Input": {
        "description": "Count the elements of a list value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_count",
            "default": "list_count",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListCount",
        "type": "object"
      },
      "TableListCount-Output": {
        "description": "Count the elements of a list value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_count",
            "default": "list_count",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListCount",
        "type": "object"
      },
      "TableListFilter-Input": {
        "description": "Keep only the list items whose field passes a test.\n\nAn enrichment payload lands as a list of objects (every job opening, every\nfunding round, every contact) and the row usually wants a subset of it:\nthe engineering roles, the rounds after 2024, the contacts with an email.\nWithout this the whole list is the only thing a cell can hold.\n\n``field`` is a dotted path INSIDE each item (``location.country``); leaving\nit empty tests the item itself, which is what a list of plain strings\nneeds. ``exists``/``missing`` ignore ``value``: they ask only whether the\nfield is there.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "field": {
            "default": "",
            "description": "Dotted path inside each item; empty tests the item itself.",
            "maxLength": 200,
            "title": "Field",
            "type": "string"
          },
          "function": {
            "const": "list_filter",
            "default": "list_filter",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "operator": {
            "default": "eq",
            "enum": [
              "eq",
              "neq",
              "gt",
              "lt",
              "gte",
              "lte",
              "contains",
              "not_contains",
              "exists",
              "missing"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value"
          }
        },
        "title": "TableListFilter",
        "type": "object"
      },
      "TableListFilter-Output": {
        "description": "Keep only the list items whose field passes a test.\n\nAn enrichment payload lands as a list of objects (every job opening, every\nfunding round, every contact) and the row usually wants a subset of it:\nthe engineering roles, the rounds after 2024, the contacts with an email.\nWithout this the whole list is the only thing a cell can hold.\n\n``field`` is a dotted path INSIDE each item (``location.country``); leaving\nit empty tests the item itself, which is what a list of plain strings\nneeds. ``exists``/``missing`` ignore ``value``: they ask only whether the\nfield is there.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "field": {
            "default": "",
            "description": "Dotted path inside each item; empty tests the item itself.",
            "maxLength": 200,
            "title": "Field",
            "type": "string"
          },
          "function": {
            "const": "list_filter",
            "default": "list_filter",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "operator": {
            "default": "eq",
            "enum": [
              "eq",
              "neq",
              "gt",
              "lt",
              "gte",
              "lte",
              "contains",
              "not_contains",
              "exists",
              "missing"
            ],
            "title": "Operator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value"
          }
        },
        "title": "TableListFilter",
        "type": "object"
      },
      "TableListFirst-Input": {
        "description": "Take the first element of a list value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_first",
            "default": "list_first",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListFirst",
        "type": "object"
      },
      "TableListFirst-Output": {
        "description": "Take the first element of a list value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_first",
            "default": "list_first",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListFirst",
        "type": "object"
      },
      "TableListIntersect-Input": {
        "description": "The values this list shares with another: the overlap, in the first list's order.\n\nThe scoring question every ICP fit column asks: which of the buyer's tags,\ntechnologies or keywords are ALSO on my target list. Doing it by hand meant\none ``if_then_else`` per tag.\n\n``other`` is a column holding the second list, or literal text split on\n``separator``. Matching ignores case and surrounding spaces, because the\ntwo lists come from different sources and \"Shopify \" never equals \"shopify\"\nwhen it matters most.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_intersect",
            "default": "list_intersect",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "other": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Other"
          },
          "separator": {
            "default": ",",
            "description": "Splits ``other`` when it is text rather than a list.",
            "maxLength": 10,
            "title": "Separator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListIntersect",
        "type": "object"
      },
      "TableListIntersect-Output": {
        "description": "The values this list shares with another: the overlap, in the first list's order.\n\nThe scoring question every ICP fit column asks: which of the buyer's tags,\ntechnologies or keywords are ALSO on my target list. Doing it by hand meant\none ``if_then_else`` per tag.\n\n``other`` is a column holding the second list, or literal text split on\n``separator``. Matching ignores case and surrounding spaces, because the\ntwo lists come from different sources and \"Shopify \" never equals \"shopify\"\nwhen it matters most.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_intersect",
            "default": "list_intersect",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "other": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Other"
          },
          "separator": {
            "default": ",",
            "description": "Splits ``other`` when it is text rather than a list.",
            "maxLength": 10,
            "title": "Separator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListIntersect",
        "type": "object"
      },
      "TableListJoin-Input": {
        "description": "Join list elements into a string with a separator.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_join",
            "default": "list_join",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "separator": {
            "default": ", ",
            "title": "Separator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListJoin",
        "type": "object"
      },
      "TableListJoin-Output": {
        "description": "Join list elements into a string with a separator.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_join",
            "default": "list_join",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "separator": {
            "default": ", ",
            "title": "Separator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListJoin",
        "type": "object"
      },
      "TableListLast-Input": {
        "description": "Take the last element of a list value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_last",
            "default": "list_last",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListLast",
        "type": "object"
      },
      "TableListLast-Output": {
        "description": "Take the last element of a list value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_last",
            "default": "list_last",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListLast",
        "type": "object"
      },
      "TableListNth-Input": {
        "description": "Take the element at an index of a list value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_nth",
            "default": "list_nth",
            "title": "Function",
            "type": "string"
          },
          "index": {
            "default": 0,
            "title": "Index",
            "type": "integer"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListNth",
        "type": "object"
      },
      "TableListNth-Output": {
        "description": "Take the element at an index of a list value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_nth",
            "default": "list_nth",
            "title": "Function",
            "type": "string"
          },
          "index": {
            "default": 0,
            "title": "Index",
            "type": "integer"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListNth",
        "type": "object"
      },
      "TableListPluck-Input": {
        "description": "Pull one field out of every object in a list.\n\nEnrichment payloads routinely carry lists of objects\n(``[{\"value\": \"Payroll\"}, {\"value\": \"HR\"}]``) where the useful thing is\nthe field, not the wrapper. Plucking turns that into ``[\"Payroll\", \"HR\"]``\nso ``list_join`` and friends can work on it; items without the field\nbecome empty and scalar items pass through unchanged.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "field": {
            "minLength": 1,
            "title": "Field",
            "type": "string"
          },
          "function": {
            "const": "list_pluck",
            "default": "list_pluck",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "field"
        ],
        "title": "TableListPluck",
        "type": "object"
      },
      "TableListPluck-Output": {
        "description": "Pull one field out of every object in a list.\n\nEnrichment payloads routinely carry lists of objects\n(``[{\"value\": \"Payroll\"}, {\"value\": \"HR\"}]``) where the useful thing is\nthe field, not the wrapper. Plucking turns that into ``[\"Payroll\", \"HR\"]``\nso ``list_join`` and friends can work on it; items without the field\nbecome empty and scalar items pass through unchanged.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "field": {
            "minLength": 1,
            "title": "Field",
            "type": "string"
          },
          "function": {
            "const": "list_pluck",
            "default": "list_pluck",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "field"
        ],
        "title": "TableListPluck",
        "type": "object"
      },
      "TableListSort-Input": {
        "description": "Order a list, ascending or descending.\n\n``list_unique`` and ``list_join`` both preserve whatever order the source\nhappened to arrive in, which is fine until the cell is meant to be READ:\na top-3 of anything, a chronological history, an alphabetised tag list.\n\n``field`` names the dotted path to sort objects BY; empty sorts the items\nthemselves. Values that cannot be compared with each other (a number next\nto a string) are ordered by type first, so the sort is total instead of\nraising on the row where the data is mixed.",
        "properties": {
          "direction": {
            "default": "asc",
            "enum": [
              "asc",
              "desc"
            ],
            "title": "Direction",
            "type": "string"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "field": {
            "default": "",
            "description": "Dotted path inside each item to sort by; empty sorts the items.",
            "maxLength": 200,
            "title": "Field",
            "type": "string"
          },
          "function": {
            "const": "list_sort",
            "default": "list_sort",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListSort",
        "type": "object"
      },
      "TableListSort-Output": {
        "description": "Order a list, ascending or descending.\n\n``list_unique`` and ``list_join`` both preserve whatever order the source\nhappened to arrive in, which is fine until the cell is meant to be READ:\na top-3 of anything, a chronological history, an alphabetised tag list.\n\n``field`` names the dotted path to sort objects BY; empty sorts the items\nthemselves. Values that cannot be compared with each other (a number next\nto a string) are ordered by type first, so the sort is total instead of\nraising on the row where the data is mixed.",
        "properties": {
          "direction": {
            "default": "asc",
            "enum": [
              "asc",
              "desc"
            ],
            "title": "Direction",
            "type": "string"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "field": {
            "default": "",
            "description": "Dotted path inside each item to sort by; empty sorts the items.",
            "maxLength": 200,
            "title": "Field",
            "type": "string"
          },
          "function": {
            "const": "list_sort",
            "default": "list_sort",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListSort",
        "type": "object"
      },
      "TableListSplit-Input": {
        "description": "Split a string value into a list on a separator.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_split",
            "default": "list_split",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "separator": {
            "default": ",",
            "title": "Separator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListSplit",
        "type": "object"
      },
      "TableListSplit-Output": {
        "description": "Split a string value into a list on a separator.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_split",
            "default": "list_split",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "separator": {
            "default": ",",
            "title": "Separator",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListSplit",
        "type": "object"
      },
      "TableListUnique-Input": {
        "description": "De-duplicate list elements, keeping first-seen order.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_unique",
            "default": "list_unique",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListUnique",
        "type": "object"
      },
      "TableListUnique-Output": {
        "description": "De-duplicate list elements, keeping first-seen order.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "list_unique",
            "default": "list_unique",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableListUnique",
        "type": "object"
      },
      "TableOwnerReadSchema": {
        "description": "A workspace member, with the tables they own.",
        "properties": {
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their email address, to tell two of a name apart.",
            "title": "Email"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Their name, when they have one to show.",
            "title": "Name"
          },
          "table_count": {
            "description": "Their tables on the list, archived ones aside; 0 for a member who owns none.",
            "title": "Table Count",
            "type": "integer"
          },
          "user_id": {
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "user_id",
          "name",
          "email",
          "table_count"
        ],
        "title": "TableOwnerReadSchema",
        "type": "object"
      },
      "TablePhoneE164-Input": {
        "description": "Normalize a phone number to E.164 format.",
        "properties": {
          "default_region": {
            "default": "US",
            "title": "Default Region",
            "type": "string"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "phone_e164",
            "default": "phone_e164",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TablePhoneE164",
        "type": "object"
      },
      "TablePhoneE164-Output": {
        "description": "Normalize a phone number to E.164 format.",
        "properties": {
          "default_region": {
            "default": "US",
            "title": "Default Region",
            "type": "string"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "phone_e164",
            "default": "phone_e164",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TablePhoneE164",
        "type": "object"
      },
      "TableReadSchema": {
        "description": "A table definition with its authoritative row counter.",
        "properties": {
          "ai_made": {
            "default": false,
            "description": "Whether the AI Assistant created this table through a granted action. The owner is still the person who approved it.",
            "title": "Ai Made",
            "type": "boolean"
          },
          "archived_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When somebody archived it; null for a table on the list. An archived table is left out of All, its folder, Favorites and Recent, and still found by search and opened as before.",
            "title": "Archived At"
          },
          "auto_run": {
            "description": "Whether data changes request recompute runs by themselves. Column-definition changes always recompute.",
            "title": "Auto Run",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "deleted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the table was moved to trash; null for a live table.",
            "title": "Deleted At"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "folder_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder it sits in; null for the top level.",
            "title": "Folder Id"
          },
          "folder_path": {
            "description": "The folders on the way to it, from the top level down; empty at the top level. What the list says under a search result and the table's own breadcrumb shows.",
            "items": {
              "$ref": "#/components/schemas/TableFolderCrumbSchema"
            },
            "title": "Folder Path",
            "type": "array"
          },
          "former_tags": {
            "description": "The tags it carried when folders replaced tags, when it carried more than one and so waits for somebody to file it. Empty once it is filed.",
            "items": {
              "type": "string"
            },
            "title": "Former Tags",
            "type": "array"
          },
          "has_import_source": {
            "description": "Whether a connected tool's records are imported into this table: the tool and its refresh are the table's source (`GET /tables/{table_id}/source/`).",
            "title": "Has Import Source",
            "type": "boolean"
          },
          "has_lead_search": {
            "description": "Whether a lead search fills this table: its criteria are the table's lead search (`GET /tables/{table_id}/lead-search/`). False for a table typed by hand, loaded from a file or fed by a connected tool, and for one whose search reads a dataset no longer offered.",
            "title": "Has Lead Search",
            "type": "boolean"
          },
          "has_subdomain_feed": {
            "description": "Whether a subdomain search made this table, so it reads that domain again to add new subdomains, by hand or on the table's refresh schedule (`GET /tables/{table_id}/subdomain-feed/`).",
            "title": "Has Subdomain Feed",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_favorite": {
            "default": false,
            "description": "Whether the CALLING USER starred this table. Per-user, so a teammate may see a different value. Always false for API-key callers, which have no user to have preferences.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "keep_existing_results": {
            "description": "Whether a manual run-all only fills the errored, empty and stale cells rather than recomputing every cell in scope.",
            "title": "Keep Existing Results",
            "type": "boolean"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the calling user last opened this table; null means never.",
            "title": "Last Viewed At"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "owner_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The owner's name, resolved for display. Null when there is no owner or the account has no name to show.",
            "title": "Owner Display Name"
          },
          "owner_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who created the table. Null for tables older than this field and for anything a background job created. NOT an access control: every member of the organisation can open and edit every table.",
            "title": "Owner User Id"
          },
          "row_count": {
            "description": "Exact row count, maintained atomically by row mutations.",
            "title": "Row Count",
            "type": "integer"
          },
          "shared_as_template": {
            "default": false,
            "description": "Whether this table's shape is readable by anyone with the link, with no sign-in. Never its rows.",
            "title": "Shared As Template",
            "type": "boolean"
          },
          "table_type": {
            "$ref": "#/components/schemas/TableType",
            "default": "other",
            "description": "What one row stands for: person, company or other. Other for a table made by hand, loaded from a file or fed by a connected tool, until somebody sets it; a lead search for people or companies sets it when it fills the table. A company table offers Find people at its companies."
          },
          "table_type_set_by_search": {
            "default": false,
            "description": "Whether a lead search for people or companies fills this table, so `table_type` is the search's to say and an update that changes it is refused.",
            "title": "Table Type Set By Search",
            "type": "boolean"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "row_count",
          "auto_run",
          "keep_existing_results",
          "created_at",
          "updated_at",
          "has_lead_search",
          "has_import_source",
          "has_subdomain_feed"
        ],
        "title": "TableReadSchema",
        "type": "object"
      },
      "TableReconnectEventSchema": {
        "description": "Final frame: the stream reached its maximum age. Reconnect for a fresh one.",
        "properties": {
          "kind": {
            "const": "reconnect",
            "default": "reconnect",
            "title": "Kind",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id"
        ],
        "title": "TableReconnectEventSchema",
        "type": "object"
      },
      "TableRegexExtract-Input": {
        "description": "Extract a regex group from a string value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "regex_extract",
            "default": "regex_extract",
            "title": "Function",
            "type": "string"
          },
          "group": {
            "default": 0,
            "title": "Group",
            "type": "integer"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "pattern": {
            "title": "Pattern",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "pattern"
        ],
        "title": "TableRegexExtract",
        "type": "object"
      },
      "TableRegexExtract-Output": {
        "description": "Extract a regex group from a string value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "regex_extract",
            "default": "regex_extract",
            "title": "Function",
            "type": "string"
          },
          "group": {
            "default": 0,
            "title": "Group",
            "type": "integer"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "pattern": {
            "title": "Pattern",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "pattern"
        ],
        "title": "TableRegexExtract",
        "type": "object"
      },
      "TableRegexReplace-Input": {
        "description": "Replace regex matches in a string value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "regex_replace",
            "default": "regex_replace",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "pattern": {
            "title": "Pattern",
            "type": "string"
          },
          "replacement": {
            "title": "Replacement",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "pattern",
          "replacement"
        ],
        "title": "TableRegexReplace",
        "type": "object"
      },
      "TableRegexReplace-Output": {
        "description": "Replace regex matches in a string value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "regex_replace",
            "default": "regex_replace",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "pattern": {
            "title": "Pattern",
            "type": "string"
          },
          "replacement": {
            "title": "Replacement",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "pattern",
          "replacement"
        ],
        "title": "TableRegexReplace",
        "type": "object"
      },
      "TableReplace-Input": {
        "description": "Replace all occurrences of a substring.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "replace",
            "default": "replace",
            "title": "Function",
            "type": "string"
          },
          "new": {
            "title": "New",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "old": {
            "title": "Old",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "old",
          "new"
        ],
        "title": "TableReplace",
        "type": "object"
      },
      "TableReplace-Output": {
        "description": "Replace all occurrences of a substring.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "replace",
            "default": "replace",
            "title": "Function",
            "type": "string"
          },
          "new": {
            "title": "New",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "old": {
            "title": "Old",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "old",
          "new"
        ],
        "title": "TableReplace",
        "type": "object"
      },
      "TableResyncEventSchema": {
        "description": "Events were lost; refetch everything.\n\nEmitted when this client could not keep up with its queue, or when the\nserver's Valkey link dropped and reconnected. There is no replay log by\ndesign: a refetch is cheaper than maintaining one.",
        "properties": {
          "kind": {
            "const": "resync",
            "default": "resync",
            "title": "Kind",
            "type": "string"
          },
          "reason": {
            "title": "Reason",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "reason"
        ],
        "title": "TableResyncEventSchema",
        "type": "object"
      },
      "TableRound-Input": {
        "description": "Round a numeric value to a precision.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "round",
            "default": "round",
            "title": "Function",
            "type": "string"
          },
          "mode": {
            "default": "round",
            "enum": [
              "round",
              "ceil",
              "floor"
            ],
            "title": "Mode",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "precision": {
            "default": 0,
            "title": "Precision",
            "type": "integer"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableRound",
        "type": "object"
      },
      "TableRound-Output": {
        "description": "Round a numeric value to a precision.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "round",
            "default": "round",
            "title": "Function",
            "type": "string"
          },
          "mode": {
            "default": "round",
            "enum": [
              "round",
              "ceil",
              "floor"
            ],
            "title": "Mode",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "precision": {
            "default": 0,
            "title": "Precision",
            "type": "integer"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableRound",
        "type": "object"
      },
      "TableRoundRobin-Input": {
        "description": "Assign each row to one of a list of owners, evenly.\n\nLead routing, as a column: the rep, the region, the sending inbox. The\npiped value is the row's IDENTITY (its email, domain or id) and the\nowner is derived from a hash of it rather than from the row's position.\n\nThat is a deliberate departure from a counter-based round robin, and it is\nthe only version that behaves: re-running the column, adding rows above,\nor sorting the view all leave every existing row with the owner it already\nhad. A counter reassigns half the table the first time anything moves,\nwhich in a CRM means the wrong rep gets the follow-up.",
        "properties": {
          "assignees": {
            "description": "The owners to distribute across, e.g. rep names or inboxes.",
            "items": {
              "type": "string"
            },
            "maxItems": 200,
            "title": "Assignees",
            "type": "array"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "round_robin",
            "default": "round_robin",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableRoundRobin",
        "type": "object"
      },
      "TableRoundRobin-Output": {
        "description": "Assign each row to one of a list of owners, evenly.\n\nLead routing, as a column: the rep, the region, the sending inbox. The\npiped value is the row's IDENTITY (its email, domain or id) and the\nowner is derived from a hash of it rather than from the row's position.\n\nThat is a deliberate departure from a counter-based round robin, and it is\nthe only version that behaves: re-running the column, adding rows above,\nor sorting the view all leave every existing row with the owner it already\nhad. A counter reassigns half the table the first time anything moves,\nwhich in a CRM means the wrong rep gets the follow-up.",
        "properties": {
          "assignees": {
            "description": "The owners to distribute across, e.g. rep names or inboxes.",
            "items": {
              "type": "string"
            },
            "maxItems": 200,
            "title": "Assignees",
            "type": "array"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "round_robin",
            "default": "round_robin",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableRoundRobin",
        "type": "object"
      },
      "TableRowDeltaSchema": {
        "description": "One row's change, as a PARTIAL patch over its cells.\n\n``cells`` carries only the columns this write touched, so a compute page's\nframe is proportional to the columns computed rather than to the table's\nwidth. Clients merge, never replace.\n\nThere is no row-level version and no cleared list. Each cell carries its\nown monotonic watermark, so a delta applies per cell and applying one twice\nor out of order is a no-op; and a cleared cell is PRESENT with a null value\nrather than absent, so a partial map expresses a clear on its own.",
        "properties": {
          "cells": {
            "additionalProperties": {
              "$ref": "#/components/schemas/TableCellDeltaSchema"
            },
            "description": "Only the columns this write touched, keyed by str(column_id).",
            "title": "Cells",
            "type": "object"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          }
        },
        "required": [
          "record_id",
          "cells"
        ],
        "title": "TableRowDeltaSchema",
        "type": "object"
      },
      "TableRowFilterGroupSchema-Input": {
        "description": "A parenthesised run of conditions, joined among themselves.\n\nHolds conditions and never groups: one level of nesting is expressible and a\nsecond is not, structurally. That covers ``A and (B or C)`` (what a filter\npanel offers) while keeping the SQL a flat walk.",
        "properties": {
          "conditions": {
            "description": "The conditions inside the parentheses.",
            "items": {
              "$ref": "#/components/schemas/TableRowFilterSchema-Input"
            },
            "maxItems": 8,
            "minItems": 1,
            "title": "Conditions",
            "type": "array"
          },
          "joiner": {
            "$ref": "#/components/schemas/TableFilterJoiner",
            "default": "and",
            "description": "How this group's conditions combine."
          },
          "type": {
            "const": "group",
            "default": "group",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "conditions"
        ],
        "title": "TableRowFilterGroupSchema",
        "type": "object"
      },
      "TableRowFilterGroupSchema-Output": {
        "description": "A parenthesised run of conditions, joined among themselves.\n\nHolds conditions and never groups: one level of nesting is expressible and a\nsecond is not, structurally. That covers ``A and (B or C)`` (what a filter\npanel offers) while keeping the SQL a flat walk.",
        "properties": {
          "conditions": {
            "description": "The conditions inside the parentheses.",
            "items": {
              "$ref": "#/components/schemas/TableRowFilterSchema-Output"
            },
            "maxItems": 8,
            "minItems": 1,
            "title": "Conditions",
            "type": "array"
          },
          "joiner": {
            "$ref": "#/components/schemas/TableFilterJoiner",
            "default": "and",
            "description": "How this group's conditions combine."
          },
          "type": {
            "const": "group",
            "default": "group",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "conditions"
        ],
        "title": "TableRowFilterGroupSchema",
        "type": "object"
      },
      "TableRowFilterSchema-Input": {
        "description": "One predicate a row must satisfy.\n\nWhich operators apply depends on the column's type: a range comparison on\na checkbox is rejected rather than silently matching nothing. The valueless\noperators (``is_empty``, ``is_not_empty``, ``is_true``, ``is_false``) must\nnot carry a value.",
        "properties": {
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "$ref": "#/components/schemas/TableRowFilterScope"
              }
            ],
            "description": "A column ID, or `__any_column__` to ask about every cell in the row at once. `__any_column__` takes only `has_error` and `has_no_error`.",
            "title": "Column Id"
          },
          "operator": {
            "$ref": "#/components/schemas/TableFilterOperator"
          },
          "type": {
            "const": "condition",
            "default": "condition",
            "title": "Type",
            "type": "string"
          },
          "value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CellValue-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The operand; omitted for the valueless operators."
          }
        },
        "required": [
          "column_id",
          "operator"
        ],
        "title": "TableRowFilterSchema",
        "type": "object"
      },
      "TableRowFilterSchema-Output": {
        "description": "One predicate a row must satisfy.\n\nWhich operators apply depends on the column's type: a range comparison on\na checkbox is rejected rather than silently matching nothing. The valueless\noperators (``is_empty``, ``is_not_empty``, ``is_true``, ``is_false``) must\nnot carry a value.",
        "properties": {
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "$ref": "#/components/schemas/TableRowFilterScope"
              }
            ],
            "description": "A column ID, or `__any_column__` to ask about every cell in the row at once. `__any_column__` takes only `has_error` and `has_no_error`.",
            "title": "Column Id"
          },
          "operator": {
            "$ref": "#/components/schemas/TableFilterOperator"
          },
          "type": {
            "const": "condition",
            "default": "condition",
            "title": "Type",
            "type": "string"
          },
          "value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CellValue-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "The operand; omitted for the valueless operators."
          }
        },
        "required": [
          "column_id",
          "operator"
        ],
        "title": "TableRowFilterSchema",
        "type": "object"
      },
      "TableRowFilterScope": {
        "description": "The filter targets that name the whole ROW rather than one column.\n\n``ANY_COLUMN`` asks a question of every cell in the row at once: \"does any\ncolumn have an error?\" is the table-wide half of the per-column ``has_error``.\nIt stands in the ``column_id`` slot of an ordinary condition (the same trick\nthe system sort keys use), so a row-wide question travels through every\nsurface that already carries a predicate tree (a saved view, a run's scope,\nan export, a count) with nothing to add to any of them. The dunder spelling\nkeeps it apart from any UUID.",
        "enum": [
          "__any_column__",
          "__record_id__"
        ],
        "title": "TableRowFilterScope",
        "type": "string"
      },
      "TableRowIdsQueryRequestSchema": {
        "description": "Request body for the row-ID manifest.\n\nThe same listing vocabulary as the rows query, minus the projection: this\nasks which rows a listing selects and in what order, not what is in them.\nAnswering it reads no cell payload, so a client can hold a whole table's\nordering cheaply and then hydrate only the window it is showing.",
        "properties": {
          "cursor": {
            "anyOf": [
              {
                "maxLength": 4096,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Opaque cursor from a previous page's next_page_cursor. The rows query and the row-ID manifest answer the same cursor for the same place in a listing, and either reads the other's.",
            "title": "Cursor"
          },
          "limit": {
            "default": 10000,
            "description": "Maximum record IDs per page. Far higher than the rows query's limit because a page of IDs carries no cells.",
            "maximum": 10000.0,
            "minimum": 1.0,
            "title": "Limit",
            "type": "integer"
          },
          "offset": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Start the listing this many rows in. Mutually exclusive with `cursor`.",
            "title": "Offset"
          },
          "row_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Restrict to rows whose cells are `errored` or `fully_computed`."
          },
          "sorts": {
            "description": "Order by these columns, in priority order, instead of display order.",
            "items": {
              "$ref": "#/components/schemas/TableRowSortSchema"
            },
            "maxItems": 3,
            "title": "Sorts",
            "type": "array"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The predicate tree every returned row must satisfy."
          }
        },
        "title": "TableRowIdsQueryRequestSchema",
        "type": "object"
      },
      "TableRowSchema": {
        "description": "A table row; cells are keyed by the column ID as a string (JSON object keys).\n\nThere is no row-level version or update stamp any more. Freshness is a\nper-cell fact, and the detail panel shows each field's own ``updated_at``.",
        "properties": {
          "cells": {
            "additionalProperties": {
              "$ref": "#/components/schemas/TableCellSchema"
            },
            "title": "Cells",
            "type": "object"
          },
          "created_at": {
            "description": "When the row was created.",
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          }
        },
        "required": [
          "record_id",
          "created_at",
          "cells"
        ],
        "title": "TableRowSchema",
        "type": "object"
      },
      "TableRowSearchCountRequestSchema": {
        "description": "Request body for counting a search's matches: what to look for, where, among which rows.\n\nThe search's own filter half, so the count and the pages can never disagree\nabout what matches. No sort: a count is the same in any order.",
        "properties": {
          "column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 500,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Restrict the search to these columns; omit to search every text column.",
            "title": "Column Ids"
          },
          "query": {
            "description": "The substring to look for; matched case-insensitively.",
            "maxLength": 256,
            "minLength": 1,
            "title": "Query",
            "type": "string"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The filters the grid is showing, for the same reason."
          }
        },
        "required": [
          "query"
        ],
        "title": "TableRowSearchCountRequestSchema",
        "type": "object"
      },
      "TableRowSearchCountSchema": {
        "description": "How many cells a search finds.",
        "properties": {
          "count": {
            "description": "Matching cells. Exact, not an estimate.",
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "TableRowSearchCountSchema",
        "type": "object"
      },
      "TableRowSearchMatchSchema": {
        "description": "One matching cell, and where its row sits in the current listing.",
        "properties": {
          "column_id": {
            "format": "uuid",
            "title": "Column Id",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "row_offset": {
            "description": "Zero-based position of the row in the current listing.",
            "title": "Row Offset",
            "type": "integer"
          }
        },
        "required": [
          "record_id",
          "column_id",
          "row_offset"
        ],
        "title": "TableRowSearchMatchSchema",
        "type": "object"
      },
      "TableRowSearchRequestSchema": {
        "description": "Request body for the in-table search.\n\n``sorts`` and ``where`` are the grid's CURRENT ones, not a second query:\na match's ``row_offset`` only means \"scroll here\" if the server counted the\nsame listing the client is rendering.",
        "properties": {
          "column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 500,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Restrict the search to these columns; omit to search every text column.",
            "title": "Column Ids"
          },
          "cursor": {
            "anyOf": [
              {
                "maxLength": 1024,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Opaque cursor from a previous page's next_page_cursor.",
            "title": "Cursor"
          },
          "limit": {
            "default": 10,
            "description": "Maximum matches per page.",
            "maximum": 100.0,
            "minimum": 1.0,
            "title": "Limit",
            "type": "integer"
          },
          "query": {
            "description": "The substring to look for; matched case-insensitively.",
            "maxLength": 256,
            "minLength": 1,
            "title": "Query",
            "type": "string"
          },
          "sorts": {
            "description": "The sort the grid is showing, so offsets line up with it.",
            "items": {
              "$ref": "#/components/schemas/TableRowSortSchema"
            },
            "maxItems": 3,
            "title": "Sorts",
            "type": "array"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The filters the grid is showing, for the same reason."
          }
        },
        "required": [
          "query"
        ],
        "title": "TableRowSearchRequestSchema",
        "type": "object"
      },
      "TableRowSortSchema": {
        "description": "The column a rows query is ordered by, and which way.",
        "properties": {
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "$ref": "#/components/schemas/TableRowSystemSortKey"
              }
            ],
            "description": "A column ID, or `__created_at__` / `__updated_at__` to order by when the row was added or last edited.",
            "title": "Column Id"
          },
          "direction": {
            "$ref": "#/components/schemas/TableSortDirection",
            "default": "asc",
            "description": "Ascending or descending."
          }
        },
        "required": [
          "column_id"
        ],
        "title": "TableRowSortSchema",
        "type": "object"
      },
      "TableRowStatus": {
        "description": "A row-level state, derived from its cells rather than stored.\n\n``ERRORED`` is \"any cell of this row failed to compute\"; ``FULLY_COMPUTED``\nis its exact complement, so the two partition the table. Serves the built-in\nsmart views, which are questions about computation rather than about values.\nThe ordinary filter vocabulary cannot express either.",
        "enum": [
          "errored",
          "fully_computed"
        ],
        "title": "TableRowStatus",
        "type": "string"
      },
      "TableRowSystemSortKey": {
        "description": "The sort keys that order by the ROW rather than by one column's cells.\n\n``CREATED_AT`` is when the row was added; ``UPDATED_AT`` is when any of its\ncells last changed (the row was added, for one with no cells). They share\nthe sort slot with column IDs, so a query or a saved view names either the\nsame way; the dunder spelling keeps them apart from any UUID.",
        "enum": [
          "__created_at__",
          "__updated_at__"
        ],
        "title": "TableRowSystemSortKey",
        "type": "string"
      },
      "TableRowWhereItemSchema-Input": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/TableRowFilterSchema-Input"
          },
          {
            "$ref": "#/components/schemas/TableRowFilterGroupSchema-Input"
          }
        ]
      },
      "TableRowWhereItemSchema-Output": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/TableRowFilterSchema-Output"
          },
          {
            "$ref": "#/components/schemas/TableRowFilterGroupSchema-Output"
          }
        ]
      },
      "TableRowsChangedEventSchema": {
        "description": "One or more rows changed; apply the deltas directly, no refetch needed.",
        "properties": {
          "kind": {
            "const": "rows_changed",
            "default": "rows_changed",
            "title": "Kind",
            "type": "string"
          },
          "rows": {
            "items": {
              "$ref": "#/components/schemas/TableRowDeltaSchema"
            },
            "title": "Rows",
            "type": "array"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "rows"
        ],
        "title": "TableRowsChangedEventSchema",
        "type": "object"
      },
      "TableRowsCountRequestSchema": {
        "description": "Request body for the row count.\n\nThe predicate half of the rows query and nothing else: no cursor, no\nprojection, no sort. Counting is order-independent by definition, and a\ncaller that sends a sort is asking for something this cannot mean.",
        "properties": {
          "except_record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Leave these rows out of the count: the rows unticked after Select all. At most 1000.",
            "title": "Except Record Ids"
          },
          "row_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Restrict to rows whose cells are `errored` or `fully_computed`."
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The predicate tree rows must satisfy. Omit to count the whole table."
          }
        },
        "title": "TableRowsCountRequestSchema",
        "type": "object"
      },
      "TableRowsCountSchema": {
        "description": "How many rows a predicate selects.",
        "properties": {
          "count": {
            "description": "Rows matching the predicate. Exact, not an estimate.",
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "TableRowsCountSchema",
        "type": "object"
      },
      "TableRowsCreateSchema": {
        "description": "Request body for the row create: how many empty rows, and where.\n\nWithout an anchor, rows are appended to the end of the table. With one,\nexactly one row is inserted directly above or below the anchor row.",
        "properties": {
          "after_record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Insert a single row directly below this row.",
            "title": "After Record Id"
          },
          "before_record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Insert a single row directly above this row.",
            "title": "Before Record Id"
          },
          "count": {
            "default": 1,
            "description": "Number of empty rows to append to the table.",
            "maximum": 1000.0,
            "minimum": 1.0,
            "title": "Count",
            "type": "integer"
          }
        },
        "title": "TableRowsCreateSchema",
        "type": "object"
      },
      "TableRowsCreatedResponseSchema": {
        "description": "The rows appended by a create, in creation order.",
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          },
          "rows": {
            "items": {
              "$ref": "#/components/schemas/TableRowSchema"
            },
            "title": "Rows",
            "type": "array"
          }
        },
        "required": [
          "count",
          "rows"
        ],
        "title": "TableRowsCreatedResponseSchema",
        "type": "object"
      },
      "TableRowsDeleteSchema": {
        "description": "Request body for the bulk row delete: two scopes, one body.\n\nSend ``record_ids`` to delete a checkbox selection. Send ``all: true`` to\ndelete every row the current listing matches, optionally narrowed by\n``where``/``row_status``, exactly the predicate vocabulary of the rows\nquery, so \"delete everything matching my filters\" and \"show me everything\nmatching my filters\" can never disagree about what matches. The explicit\nflag exists so an accidentally empty body deletes nothing.",
        "properties": {
          "all": {
            "default": false,
            "description": "Delete every matching row rather than a named set. Required (and only honoured) when record_ids is absent.",
            "title": "All",
            "type": "boolean"
          },
          "duplicates": {
            "default": false,
            "description": "Under a `where` that keeps one row per value (`unique_by`, or its `within`'s), delete the duplicates it hides instead of the rows it keeps: every other row the where's other conditions let through whose value in that column a selected row holds. The selected rows stay, so the view shows the same rows afterwards: with `all`, every row the where keeps less `except_record_ids`; with `record_ids`, those of them the where still shows, and none of the rows named is deleted (they then take `where` too). A row blank in the column is never a duplicate. The answer says how many rows stay (`kept_count`). Takes no `row_status`.",
            "title": "Duplicates",
            "type": "boolean"
          },
          "except_record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Leave these rows out of a selection of every matching row: the rows unticked after Select all. At most 1000.",
            "title": "Except Record Ids"
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Record IDs of the rows to delete.",
            "title": "Record Ids"
          },
          "row_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Narrow an `all` delete to errored or fully computed rows."
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "Narrow an `all` delete to rows matching this predicate tree."
          }
        },
        "title": "TableRowsDeleteSchema",
        "type": "object"
      },
      "TableRowsDeletedResponseSchema": {
        "description": "Result of a bulk row delete; missing record IDs are simply absent.\n\nA predicate (`all: true`) delete reports only the count. Echoing ten\nthousand UUIDs would say nothing the count does not.",
        "properties": {
          "count": {
            "default": 1,
            "description": "The number of resources that were deleted.",
            "title": "Count",
            "type": "integer"
          },
          "deleted_record_ids": {
            "description": "The rows deleted, for a delete by record_ids. Empty for an `all` delete, which reports only the count, and for a duplicates delete.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Deleted Record Ids",
            "type": "array"
          },
          "detail": {
            "description": "The detail of why the resource was deleted.",
            "title": "Detail",
            "type": "string"
          },
          "kept_count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a duplicates delete: the rows that stay, one per value and every row blank in the column. Null for any other delete.",
            "title": "Kept Count"
          }
        },
        "required": [
          "detail"
        ],
        "title": "TableRowsDeletedResponseSchema",
        "type": "object"
      },
      "TableRowsInvalidatedEventSchema": {
        "description": "The row SET changed (rows created or deleted). Refetch the page.\n\nMembership and ordering changed, and a keyset window cannot be patched\nlocally, so this is deliberately an invalidation rather than a delta.",
        "properties": {
          "kind": {
            "const": "rows_invalidated",
            "default": "rows_invalidated",
            "title": "Kind",
            "type": "string"
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The affected rows when known; null for a whole-table drain or a degraded batch.",
            "title": "Record Ids"
          },
          "row_count": {
            "description": "The table's authoritative row count after the change.",
            "title": "Row Count",
            "type": "integer"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "row_count"
        ],
        "title": "TableRowsInvalidatedEventSchema",
        "type": "object"
      },
      "TableRowsQueryRequestSchema": {
        "description": "Request body for the rows query.\n\nA POST rather than a GET because a filter list has no honest query-string\nencoding. ``column_ids`` is the projection: send the columns the grid will\nactually render and the response carries only those cells.",
        "properties": {
          "column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 500,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Project each row's cells to these columns. Omit for every column. A column left out of the projection is not blank: its cells were not fetched.",
            "title": "Column Ids"
          },
          "cursor": {
            "anyOf": [
              {
                "maxLength": 4096,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Opaque cursor from a previous page's next_page_cursor. The rows query and the row-ID manifest answer the same cursor for the same place in a listing, and either reads the other's.",
            "title": "Cursor"
          },
          "limit": {
            "default": 10,
            "description": "Maximum rows per page.",
            "maximum": 100.0,
            "minimum": 1.0,
            "title": "Limit",
            "type": "integer"
          },
          "offset": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Start the listing this many rows in, rather than at the top: a jump-to-row seek. Mutually exclusive with `cursor`, which resumes a listing rather than starting one. Postgres walks the skipped rows, so use this for a deliberate jump. Keep paging with `next_page_cursor`.",
            "title": "Offset"
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hydrate exactly these rows, instead of describing a listing. Mutually exclusive with `sorts`, `where`, `row_status`, `offset` and `cursor`: those select rows, and this names them. Pair with `/rows/ids/` to fetch an ordering once and then fill in row contents a window at a time, which lets re-sorting or re-filtering reuse cells the client already holds.",
            "title": "Record Ids"
          },
          "row_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Restrict to rows whose CELLS are in a given state: `errored` (any cell failed to compute) or `fully_computed` (none did). ANDed with `where`. This is a question about computation, which the filter operators (each of which tests only one column's value) cannot ask."
          },
          "sorts": {
            "description": "Order by these columns, in priority order, instead of the display order. Blanks sort last for every key, whichever way that key runs.",
            "items": {
              "$ref": "#/components/schemas/TableRowSortSchema"
            },
            "maxItems": 3,
            "title": "Sorts",
            "type": "array"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The predicate tree every returned row must satisfy. Omit for an unfiltered listing."
          }
        },
        "title": "TableRowsQueryRequestSchema",
        "type": "object"
      },
      "TableRowsWatermarkSchema": {
        "description": "The rows watermark: the authoritative row counter.\n\nThere is no cell-write watermark here. Freshness is a per-cell fact now,\nand every cell write is already announced on the change feed as a delta\nthe client applies directly, so a polled max(updated_at) over 100M cell\nrows would buy an index on the hottest table in the schema to answer a\nquestion nothing asks.",
        "properties": {
          "count": {
            "description": "Exact row count, maintained atomically by row mutations.",
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "TableRowsWatermarkSchema",
        "type": "object"
      },
      "TableRowsWhereSchema-Input": {
        "description": "The whole predicate for a rows query.\n\n``items`` mixes conditions with groups under one joiner, so ``A and (B or C)``\nis an AND over ``[A, group(OR, [B, C])]``. Send no ``where`` at all rather\nthan an empty one, so \"no filter\" stays a single state.\n\nThe cap is on LEAVES, not on items: eight conditions cost eight correlated\nEXISTS clauses whether they are grouped or not, and it is the clause count\nthat the query planner pays for.",
        "properties": {
          "items": {
            "description": "Conditions and groups. May be empty when unique_by or within is set.",
            "items": {
              "$ref": "#/components/schemas/TableRowWhereItemSchema-Input"
            },
            "maxItems": 8,
            "title": "Items",
            "type": "array"
          },
          "joiner": {
            "$ref": "#/components/schemas/TableFilterJoiner",
            "default": "and",
            "description": "How the top-level items combine."
          },
          "unique_by": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Keep one row per value of this column: of the rows the conditions match, the first in the table's own order for each value. Rows with the column blank always stay. Not a list or object column.",
            "title": "Unique By"
          },
          "within": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "A second filter rows must also match, applied on its own: its unique_by picks from its own conditions only. How to narrow a saved view's rows without changing which row it keeps per value. One level deep."
          }
        },
        "title": "TableRowsWhereSchema",
        "type": "object"
      },
      "TableRowsWhereSchema-Output": {
        "description": "The whole predicate for a rows query.\n\n``items`` mixes conditions with groups under one joiner, so ``A and (B or C)``\nis an AND over ``[A, group(OR, [B, C])]``. Send no ``where`` at all rather\nthan an empty one, so \"no filter\" stays a single state.\n\nThe cap is on LEAVES, not on items: eight conditions cost eight correlated\nEXISTS clauses whether they are grouped or not, and it is the clause count\nthat the query planner pays for.",
        "properties": {
          "items": {
            "description": "Conditions and groups. May be empty when unique_by or within is set.",
            "items": {
              "$ref": "#/components/schemas/TableRowWhereItemSchema-Output"
            },
            "maxItems": 8,
            "title": "Items",
            "type": "array"
          },
          "joiner": {
            "$ref": "#/components/schemas/TableFilterJoiner",
            "default": "and",
            "description": "How the top-level items combine."
          },
          "unique_by": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Keep one row per value of this column: of the rows the conditions match, the first in the table's own order for each value. Rows with the column blank always stay. Not a list or object column.",
            "title": "Unique By"
          },
          "within": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "A second filter rows must also match, applied on its own: its unique_by picks from its own conditions only. How to narrow a saved view's rows without changing which row it keeps per value. One level deep."
          }
        },
        "title": "TableRowsWhereSchema",
        "type": "object"
      },
      "TableRunChangedEventSchema": {
        "description": "A recompute run was created, progressed, or reached a terminal status.",
        "properties": {
          "kind": {
            "const": "run_changed",
            "default": "run_changed",
            "title": "Kind",
            "type": "string"
          },
          "run": {
            "$ref": "#/components/schemas/TableRunDeltaSchema"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "run"
        ],
        "title": "TableRunChangedEventSchema",
        "type": "object"
      },
      "TableRunCreateSchema": {
        "description": "What to run: a column, several columns over rows, rows, or every failed cell.\n\nOne body for the run and its preview, so the price quoted is the price of\nthe run asked for. ``kind`` says which of the fields apply.",
        "properties": {
          "all": {
            "default": false,
            "description": "kind=rows: run every row the view matches (`where`, `row_status`, less `except_record_ids`) instead of `record_ids`. With none of those it runs the whole table, whatever its size. Narrowed, at most `view_scope_max_rows` rows may match; a wider view is refused with `scope_too_large`.",
            "title": "All",
            "type": "boolean"
          },
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "kind=column: the column to run.",
            "title": "Column Id"
          },
          "column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 100,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "kind=columns: the computed columns to run, in any order. A column another one here feeds is planned once, after its input, so no column reads a value a sibling is still computing.",
            "title": "Column Ids"
          },
          "except_record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 1000,
                "minItems": 1,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Leave these rows out of a selection of every matching row: the rows unticked after Select all. At most 1000.",
            "title": "Except Record Ids"
          },
          "kind": {
            "$ref": "#/components/schemas/TableRunKind",
            "description": "What the run covers. `column`: one computed column (`column_id`) over a `scope`. `columns`: several columns (`column_ids`) over chosen rows (`record_ids`), as one run in dependency order, which is what a swept selection in the grid becomes. `rows`: chosen rows (`record_ids`), or every row the view matches (`all`), across every computed column. `failed_cells`: only the cells that failed, in every computed column; it takes no other field."
          },
          "limit": {
            "anyOf": [
              {
                "maximum": 10000.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "kind=column, scope=first_n: how many rows (default 10).",
            "title": "Limit"
          },
          "offset": {
            "anyOf": [
              {
                "maximum": 1000000.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "kind=column, scope=first_n: the row to start from, in display order; omit to start at the first row.",
            "title": "Offset"
          },
          "record_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "kind=column, scope=cell: the target row; see also record_ids.",
            "title": "Record Id"
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 10000,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The target rows. kind=column with scope=cell (wins over record_id); kind=columns, shared by every column named; kind=rows, the rows to run instead of `all`. At most 10000, and for kind=column 1000; a kind=columns run names at most 100000 cells (columns times rows). Duplicates are dropped and the order is kept.",
            "title": "Record Ids"
          },
          "row_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "The grid's active smart view (errored or fully computed rows), ANDed with `where`. kind=column, or kind=rows with `all`."
          },
          "scope": {
            "$ref": "#/components/schemas/TableRunScope",
            "default": "all",
            "description": "kind=column: all | errored | unfilled | first_n | cell. all, errored and first_n share the column's own run: a broader run replaces a narrower one still going, and cells already computed under the same definition are skipped. cell runs are independent of each other."
          },
          "sorts": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TableRowSortSchema"
                },
                "maxItems": 8,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "kind=column: the grid's active sort, so `first_n` means the first N rows the person can SEE rather than the first N in stored order. Ignored by every other scope.",
            "title": "Sorts"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The grid's active filter, in the rows query's own vocabulary. kind=column: narrows every scope but `cell` to the matching rows (`all` runs every matching row, `errored` / `unfilled` keep only matching rows, `first_n` counts within them). kind=rows with `all`: the rows to run."
          }
        },
        "required": [
          "kind"
        ],
        "title": "TableRunCreateSchema",
        "type": "object"
      },
      "TableRunDeltaSchema": {
        "description": "One run's current state; mirrors the REST run schema so clients can drop it straight in.",
        "properties": {
          "cells_awaiting": {
            "default": 0,
            "description": "Cells held because an input they read has not been computed yet; not terminal, counted within cells_done.",
            "title": "Cells Awaiting",
            "type": "integer"
          },
          "cells_done": {
            "title": "Cells Done",
            "type": "integer"
          },
          "cells_failed": {
            "title": "Cells Failed",
            "type": "integer"
          },
          "cells_no_data": {
            "default": 0,
            "description": "No-data cells: ran clean but found nothing.",
            "title": "Cells No Data",
            "type": "integer"
          },
          "cells_skipped": {
            "default": 0,
            "description": "Deliberately skipped cells: missing input or false condition.",
            "title": "Cells Skipped",
            "type": "integer"
          },
          "cells_total": {
            "title": "Cells Total",
            "type": "integer"
          },
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Column Id"
          },
          "column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Every column the run's plan covers, in layer order. Optional so a frame enqueued by an older worker still deserializes; absent means fall back to column_id.",
            "title": "Column Ids"
          },
          "completed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed At"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "credits_charged": {
            "default": 0,
            "description": "Credits charged so far. Grows while the run works, as its finished cells are settled every few seconds; final once the run ends.",
            "title": "Credits Charged",
            "type": "number"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "row_scope": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRunRowScopeSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The rows this run resolved to. Optional so a frame enqueued by an older worker still deserializes mid-rolling-deploy; absent reads as all_rows."
          },
          "started_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Started At"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "trigger": {
            "title": "Trigger",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "trigger",
          "status",
          "cells_total",
          "cells_done",
          "cells_failed",
          "error",
          "created_at",
          "started_at",
          "completed_at"
        ],
        "title": "TableRunDeltaSchema",
        "type": "object"
      },
      "TableRunKind": {
        "description": "What a run request covers.",
        "enum": [
          "column",
          "columns",
          "rows",
          "failed_cells"
        ],
        "title": "TableRunKind",
        "type": "string"
      },
      "TableRunPreviewSchema": {
        "description": "What a run would cover and cost, before it is asked for.\n\nPriced by the same plan the run is minted from. Free runs (formula/manual\ncolumns) cost nothing and are always sufficient, even at a zero balance.\nRow counts and cell freshness can still shift between the preview and the run.",
        "properties": {
          "balance_sufficient": {
            "description": "Whether the organization's available credits cover the estimate.",
            "title": "Balance Sufficient",
            "type": "boolean"
          },
          "cells_total": {
            "description": "All cells the run would compute over the rows that run, charged or not.",
            "title": "Cells Total",
            "type": "integer"
          },
          "columns": {
            "description": "Every enrichment or export column the run would work on, in the order it runs: the column asked for first, then the columns that read it. Each with the most its part can cost and what it usually costs.",
            "items": {
              "$ref": "#/components/schemas/ColumnRunEstimateSchema"
            },
            "title": "Columns",
            "type": "array"
          },
          "estimated_credits": {
            "description": "The most the run can cost, in credits: every row of every paid column charged its full per-row price. What the credit hold and the confirmation gate reason about.",
            "title": "Estimated Credits",
            "type": "number"
          },
          "expected_credits": {
            "default": 0.0,
            "description": "What a run like this usually costs, in credits: a column charged by use (an AI column) at the share of its per-row maximum the same kind of cell has actually been charged (a typical share while there is no history yet), every other column at its price. Quote both, this first: about expected_credits, up to estimated_credits. Equal to estimated_credits for a flat price (no column charged by use, as in a run of enrichments): then quote that one figure, without up to.",
            "title": "Expected Credits",
            "type": "number"
          },
          "export_writes": {
            "description": "Export columns this run would fire. Present so the confirmation can name the destination, the object and the action instead of only a row count. Empty for a run that writes nothing outside this table.",
            "items": {
              "$ref": "#/components/schemas/ExportWriteEstimateSchema"
            },
            "title": "Export Writes",
            "type": "array"
          },
          "is_estimate": {
            "description": "Always true: freshness and row counts can shift by run time.",
            "title": "Is Estimate",
            "type": "boolean"
          },
          "requires_confirmation": {
            "default": false,
            "description": "True when the estimate crosses the confirmation threshold: ask before spending instead of running on first click.",
            "title": "Requires Confirmation",
            "type": "boolean"
          },
          "rows_held_back": {
            "default": 0,
            "description": "Rows in scope the column's run condition would hold back. The run skips them and charges nothing for them, so they are already subtracted from rows_in_scope and from the price.",
            "title": "Rows Held Back",
            "type": "integer"
          },
          "rows_in_scope": {
            "default": 0,
            "description": "Rows the run would compute. This is what a scope choice is about, and what the credit estimate is derived from; `cells_total` also counts the dependent columns the run would recompute.",
            "title": "Rows In Scope",
            "type": "integer"
          },
          "rows_waiting_for_sources": {
            "default": 0,
            "description": "Failed rows a failed-rows run leaves out because some of the column's sources are still unavailable. Not in rows_in_scope: Run failed rows re-runs them once every source is back, and is refused while they are all it has.",
            "title": "Rows Waiting For Sources",
            "type": "integer"
          },
          "scope_too_large": {
            "default": false,
            "description": "True when the filtered view names more rows than a run may be scoped to (`view_scope_max_rows`). `rows_in_scope` still carries the matching count; the run itself would be refused with `scope_too_large`. Narrow the filter, or run the whole table.",
            "title": "Scope Too Large",
            "type": "boolean"
          },
          "unit_price": {
            "description": "Blended credits per charged cell (total estimate / units); 0 for free runs.",
            "title": "Unit Price",
            "type": "number"
          },
          "units": {
            "description": "Cells that would incur a charge (0 for free runs).",
            "title": "Units",
            "type": "integer"
          }
        },
        "required": [
          "units",
          "unit_price",
          "estimated_credits",
          "cells_total",
          "is_estimate",
          "balance_sufficient"
        ],
        "title": "TableRunPreviewSchema",
        "type": "object"
      },
      "TableRunReadSchema": {
        "description": "A table recompute run with its static denominator and monotone counters.",
        "properties": {
          "cells_awaiting": {
            "description": "Cells the run held because an input they read has not been computed yet. Not a final state: a later run fills them. Counted within cells_done.",
            "title": "Cells Awaiting",
            "type": "integer"
          },
          "cells_done": {
            "description": "Cells processed so far; clamped to cells_total so the banner can never overshoot.",
            "title": "Cells Done",
            "type": "integer"
          },
          "cells_failed": {
            "description": "Cells whose formula evaluation failed.",
            "title": "Cells Failed",
            "type": "integer"
          },
          "cells_no_data": {
            "description": "Cells that ran clean but found nothing. Never retried, and excluded from errored views. Free for a lookup; an AI column's cell is charged what it used. Counted within cells_done.",
            "title": "Cells No Data",
            "type": "integer"
          },
          "cells_skipped": {
            "description": "Cells the run deliberately skipped: a missing required input or a false run condition. Counted within cells_done.",
            "title": "Cells Skipped",
            "type": "integer"
          },
          "cells_total": {
            "description": "Exact static denominator, fixed when the run plan is minted.",
            "title": "Cells Total",
            "type": "integer"
          },
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The column a column-lineage run recomputes, parsed from its workflow identity; null for whole-table runs. Narrows the grid's busy paint to one column; `row_scope` is what narrows it to the rows within that column.",
            "title": "Column Id"
          },
          "column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Every column this run's plan covers, in dependency (layer) order, not the order they were requested in. Null on runs minted before the plan was published, where column_id is all there is. This is what narrows the grid's busy paint when one run covers several columns, which column_id cannot express.",
            "title": "Column Ids"
          },
          "completed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed At"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "credits_charged": {
            "default": 0,
            "description": "Credits charged so far. Grows while the run works, as its finished cells are settled every few seconds; final once the run ends.",
            "title": "Credits Charged",
            "type": "number"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Failure description when the run status is failed.",
            "title": "Error"
          },
          "export_retry_attempt": {
            "default": 0,
            "description": "How many automatic export retries preceded this run. 0 is a run a person or a schedule asked for; higher values mark the follow-ups queued for rows whose push failed for a retryable reason, so a run history can tell 'we tried again' from 'you ran it again'.",
            "title": "Export Retry Attempt",
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "row_scope": {
            "$ref": "#/components/schemas/TableRunRowScopeReadSchema",
            "description": "The rows this run resolved to at mint. Present on every read so a resync cannot lose it and silently fall back to painting the whole column busy."
          },
          "started_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Started At"
          },
          "status": {
            "$ref": "#/components/schemas/TableRunStatus",
            "description": "The run's lifecycle status."
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "trigger": {
            "$ref": "#/components/schemas/TableRunTrigger",
            "description": "What kind of mutation requested the run."
          }
        },
        "required": [
          "id",
          "table_id",
          "trigger",
          "status",
          "cells_total",
          "cells_done",
          "cells_failed",
          "cells_skipped",
          "cells_no_data",
          "cells_awaiting",
          "error",
          "created_at",
          "started_at",
          "completed_at",
          "row_scope"
        ],
        "title": "TableRunReadSchema",
        "type": "object"
      },
      "TableRunRowScopeReadSchema": {
        "description": "The rows a run resolved to: what lets a client mark exactly those busy.\n\n``record_ids`` is populated for the ``record_ids`` kind alone. ``all_rows``\nand ``unlisted`` both mean \"assume every row\": the first because it is\ntrue, the second because the set was too large to carry on every frame.\nCollapsing them keeps a client's fallback one branch rather than two.\n``all_but`` reads as ``unlisted`` less ``excluded_record_ids``: the rows\nunticked after a Select all, which a client never marks busy.",
        "properties": {
          "excluded_record_ids": {
            "description": "Rows the run leaves out although its scope is otherwise every row; empty unless kind is all_but.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Excluded Record Ids",
            "type": "array"
          },
          "kind": {
            "$ref": "#/components/schemas/TableRunScopeKind",
            "description": "How the resolved row set is published."
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The exact rows the run will touch; null unless kind is record_ids.",
            "title": "Record Ids"
          },
          "rows": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rows the resolved scope covers; null for all rows.",
            "title": "Rows"
          }
        },
        "required": [
          "kind",
          "rows",
          "record_ids"
        ],
        "title": "TableRunRowScopeReadSchema",
        "type": "object"
      },
      "TableRunRowScopeSchema": {
        "description": "The rows a run resolved to, so a reader can mark exactly those cells busy.\n\n``kind`` is a plain string rather than the run domain's enum: this package\nsits under the table stratum and cannot import from it, which is also why\n``trigger`` and ``status`` above are strings. Its values are\n``all_rows`` | ``record_ids`` | ``unlisted`` | ``all_but``; the first and\nthird both mean \"assume every row\", and the last every row but\n``excluded_record_ids``.",
        "properties": {
          "excluded_record_ids": {
            "description": "The rows an all_but run leaves out; empty for every other kind.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Excluded Record Ids",
            "type": "array"
          },
          "kind": {
            "title": "Kind",
            "type": "string"
          },
          "record_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The exact rows the run will touch; populated for the record_ids kind only.",
            "title": "Record Ids"
          },
          "rows": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rows the resolved scope covers; None for all rows.",
            "title": "Rows"
          }
        },
        "required": [
          "kind"
        ],
        "title": "TableRunRowScopeSchema",
        "type": "object"
      },
      "TableRunScope": {
        "description": "Row scope for an on-demand ``COLUMN_MANUAL`` run.\n\n``CELL`` (a single row, origin-keyed so independent cell re-runs never\nterminate each other) rides the same enum as the column-lineage scopes.\n``UNFILLED`` is \"empty or out-of-date\": errored, stale, valueless and\nnever-computed cells, minus fresh deliberate skips, which would only\nskip again.",
        "enum": [
          "all",
          "errored",
          "unfilled",
          "first_n",
          "cell"
        ],
        "title": "TableRunScope",
        "type": "string"
      },
      "TableRunScopeKind": {
        "description": "How a minted run's RESOLVED row set is published to readers.\n\nDistinct from :class:`TableRunScope`, which is what the caller ASKED for.\nThe two disagree routinely (``ALL`` on a ``keep_existing_results`` table is\nsilently narrowed to the unfilled rows at mint) and only the resolved set\ncan be painted, so only the resolved set is stored.\n\n``UNLISTED`` is a real row subset whose ids were too many to carry on every\nchangefeed frame (see ``max_persisted_scope_rows``). It reads exactly like\n``ALL_ROWS`` to a client: assume every row. That keeps the fallback one\nbranch rather than two, at the cost of over-painting the rare huge partial.\n\n``ALL_BUT`` is an ``UNLISTED`` set that names the rows it leaves out: a\nSelect all with rows unticked mints one, and those rows are the ones a\nperson is looking at to see they stay untouched. It reads like\n``UNLISTED`` less the rows named; the run row stores them in\n``scope_record_ids``, and the DTO hands them on as\n``scope_excluded_record_ids`` so no reader takes them for the rows run.",
        "enum": [
          "all_rows",
          "record_ids",
          "unlisted",
          "all_but"
        ],
        "title": "TableRunScopeKind",
        "type": "string"
      },
      "TableRunStatus": {
        "description": "Lifecycle status of a table run.\n\n``PENDING`` exists for API compatibility but is never observed: runs are\nborn ``RUNNING`` at mint. ``CANCELLING`` is the requested-stop state the\npage activities observe; the workflow finalizes it to ``CANCELLED``.",
        "enum": [
          "pending",
          "running",
          "cancelling",
          "cancelled",
          "paused_for_credits",
          "completed",
          "completed_with_errors",
          "failed"
        ],
        "title": "TableRunStatus",
        "type": "string"
      },
      "TableRunTrigger": {
        "description": "What kind of mutation requested a recompute run.",
        "enum": [
          "cell_edited",
          "row_added",
          "row_manual",
          "column_added",
          "column_edited",
          "column_manual"
        ],
        "title": "TableRunTrigger",
        "type": "string"
      },
      "TableRunsCreatedSchema": {
        "description": "The runs a run request asked for.\n\nA run row is minted after the request commits, so ``runs`` is usually\nempty at the moment of asking; ``request_ids`` is known at once, and each\nrun carries its request's id as its origin.",
        "properties": {
          "request_ids": {
            "description": "One id per run asked for: one for a column, columns or rows run, and one per computed column for a failed_cells run.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Request Ids",
            "type": "array"
          },
          "runs": {
            "description": "The runs already minted, in the order asked. A run whose start is still queued is absent; the active-runs feed picks it up.",
            "items": {
              "$ref": "#/components/schemas/TableRunReadSchema"
            },
            "title": "Runs",
            "type": "array"
          }
        },
        "required": [
          "request_ids",
          "runs"
        ],
        "title": "TableRunsCreatedSchema",
        "type": "object"
      },
      "TableScheduleFrequency": {
        "description": "How often a table re-imports, in the vocabulary the settings panel offers.\n\nThe presets are stored as cron because \"the 8th of every month at 09:00\" is\na calendar statement that an interval cannot make: an interval of 30 days\ndrifts off the date within a year. CUSTOM is the escape hatch for \"every N\ndays/weeks/months\", which is an interval and drifts on purpose, anchored to\nwhen the user set it up.\n\nHOURLY is cron too, and it is the one preset that ignores the hour the user\npicked: \"every hour at 09:00\" is not a thing anyone means. The minute is\nkept, so an hourly refresh set at 09:20 runs at twenty past every hour, and\na source that rate-limits is not hit by every table on the hour.",
        "enum": [
          "hourly",
          "daily",
          "weekly",
          "monthly",
          "quarterly",
          "custom"
        ],
        "title": "TableScheduleFrequency",
        "type": "string"
      },
      "TableScheduleIntervalUnit": {
        "description": "The unit a CUSTOM cadence counts in.\n\nHOURS is the only one with no time of day to honour: \"every 6 hours at\n09:00\" is two statements that cannot both be true. It anchors to the next\noccurrence of the chosen MINUTE instead, the same way the HOURLY preset\nkeeps the minute and drops the hour.",
        "enum": [
          "hours",
          "days",
          "weeks",
          "months"
        ],
        "title": "TableScheduleIntervalUnit",
        "type": "string"
      },
      "TableScheduleSchema": {
        "description": "A table's refresh cadence.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "delete_missing_rows": {
            "description": "Whether a scheduled run deletes rows whose records are gone from the source. Forces every scheduled run to re-list everything, since a changes-only fetch cannot tell a deleted record from an unchanged one.",
            "title": "Delete Missing Rows",
            "type": "boolean"
          },
          "frequency": {
            "$ref": "#/components/schemas/TableScheduleFrequency"
          },
          "hour": {
            "description": "Local hour the cadence runs at.",
            "title": "Hour",
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "interval_unit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableScheduleIntervalUnit"
              },
              {
                "type": "null"
              }
            ]
          },
          "interval_value": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How many units apart, for a custom cadence.",
            "title": "Interval Value"
          },
          "last_skip_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableScheduleSkipReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the last firing skipped, alongside last_skipped_at."
          },
          "last_skipped_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a firing last skipped without starting a run; null if it never has.",
            "title": "Last Skipped At"
          },
          "minute": {
            "description": "Local minute the cadence runs at.",
            "title": "Minute",
            "type": "integer"
          },
          "next_run_at": {
            "format": "date-time",
            "title": "Next Run At",
            "type": "string"
          },
          "next_runs": {
            "description": "The next few fire times, so a cadence can be checked before it is trusted.",
            "items": {
              "format": "date-time",
              "type": "string"
            },
            "title": "Next Runs",
            "type": "array"
          },
          "paused": {
            "title": "Paused",
            "type": "boolean"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "time_zone": {
            "description": "IANA zone the run time is expressed in.",
            "title": "Time Zone",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "frequency",
          "interval_value",
          "interval_unit",
          "time_zone",
          "hour",
          "minute",
          "next_run_at",
          "next_runs",
          "paused",
          "delete_missing_rows",
          "last_skipped_at",
          "last_skip_reason",
          "created_at",
          "updated_at"
        ],
        "title": "TableScheduleSchema",
        "type": "object"
      },
      "TableScheduleSkipReason": {
        "description": "Why a firing skipped starting an import instead of recording a run.\n\nEvery case advances ``next_run_at`` the same as a real run does, so without\nthis the schedule just quietly keeps ticking, and a user watching for their\nnightly refresh has nothing to look at but silence.",
        "enum": [
          "source_detached",
          "run_in_progress",
          "refresh_failed"
        ],
        "title": "TableScheduleSkipReason",
        "type": "string"
      },
      "TableScoreWords-Input": {
        "description": "Score text by the weighted words it contains.\n\nThe rules half of lead scoring, without a model: \"enterprise\" is worth 3,\n\"student\" is worth -5, and the cell adds up whatever the row's text,\ntags or tech stack actually say. Expressing the same thing with\n``if_then_else`` needs one step per word and runs out of chain depth at ten.\n\nWeights are a plain object: word or phrase to number. Matching is\ncase-insensitive; a multi-word key matches as a phrase. ``count_repeats``\ndecides whether saying \"enterprise\" three times scores three times, which\nis the difference between weighing a claim and weighing a page.",
        "properties": {
          "count_repeats": {
            "default": false,
            "description": "Score every occurrence rather than once per distinct word.",
            "title": "Count Repeats",
            "type": "boolean"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "score_words",
            "default": "score_words",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "weights": {
            "additionalProperties": {
              "type": "number"
            },
            "description": "Word or phrase to score, e.g. {'enterprise': 3, 'student': -5}.",
            "title": "Weights",
            "type": "object"
          }
        },
        "title": "TableScoreWords",
        "type": "object"
      },
      "TableScoreWords-Output": {
        "description": "Score text by the weighted words it contains.\n\nThe rules half of lead scoring, without a model: \"enterprise\" is worth 3,\n\"student\" is worth -5, and the cell adds up whatever the row's text,\ntags or tech stack actually say. Expressing the same thing with\n``if_then_else`` needs one step per word and runs out of chain depth at ten.\n\nWeights are a plain object: word or phrase to number. Matching is\ncase-insensitive; a multi-word key matches as a phrase. ``count_repeats``\ndecides whether saying \"enterprise\" three times scores three times, which\nis the difference between weighing a claim and weighing a page.",
        "properties": {
          "count_repeats": {
            "default": false,
            "description": "Score every occurrence rather than once per distinct word.",
            "title": "Count Repeats",
            "type": "boolean"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "score_words",
            "default": "score_words",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "weights": {
            "additionalProperties": {
              "type": "number"
            },
            "description": "Word or phrase to score, e.g. {'enterprise': 3, 'student': -5}.",
            "title": "Weights",
            "type": "object"
          }
        },
        "title": "TableScoreWords",
        "type": "object"
      },
      "TableSortDirection": {
        "description": "Which way a sorted row listing runs.",
        "enum": [
          "asc",
          "desc"
        ],
        "title": "TableSortDirection",
        "type": "string"
      },
      "TableSourcePreviewRequestSchema": {
        "description": "What to sample.",
        "properties": {
          "integration_id": {
            "description": "The connected integration to sample.",
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          },
          "record_type": {
            "description": "Which object to sample.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Record Type",
            "type": "string"
          }
        },
        "required": [
          "integration_id",
          "record_type"
        ],
        "title": "TableSourcePreviewRequestSchema",
        "type": "object"
      },
      "TableSourcePreviewResponseSchema": {
        "description": "A sample of the records an import would bring in, and the fields inside them.\n\nNothing is created here: no table, no column, no row. Review it, then POST to\nthe create endpoint to build the table.",
        "properties": {
          "fields": {
            "description": "Sampled and declared fields.",
            "items": {
              "$ref": "#/components/schemas/SourceFieldSchema"
            },
            "title": "Fields",
            "type": "array"
          },
          "identity_field": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The recommended key of the record's ids to match rows on across refreshes: one the tool sets itself where it says which those are. Null means the provider returned nothing usable, and the import cannot proceed.",
            "title": "Identity Field"
          },
          "identity_field_choices": {
            "description": "Every id key rows could be matched on: present on all sampled records, and no two records share a value.",
            "items": {
              "type": "string"
            },
            "title": "Identity Field Choices",
            "type": "array"
          },
          "identity_field_options": {
            "description": "Every id key the sample carries, usable or not, with how many records have it, whether values repeat, and whether people can edit it.",
            "items": {
              "$ref": "#/components/schemas/IdentityFieldOptionSchema"
            },
            "title": "Identity Field Options",
            "type": "array"
          },
          "integration_id": {
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          },
          "integration_type": {
            "title": "Integration Type",
            "type": "string"
          },
          "record_type": {
            "title": "Record Type",
            "type": "string"
          },
          "sample_records": {
            "description": "The sampled records themselves.",
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "title": "Sample Records",
            "type": "array"
          },
          "suggested_display_paths": {
            "description": "Fields the create step would give their own column.",
            "items": {
              "type": "string"
            },
            "title": "Suggested Display Paths",
            "type": "array"
          },
          "supports_incremental": {
            "description": "Whether the provider can return only records changed since a given time. When false every refresh re-lists everything.",
            "title": "Supports Incremental",
            "type": "boolean"
          }
        },
        "required": [
          "integration_id",
          "integration_type",
          "record_type",
          "identity_field",
          "identity_field_choices",
          "identity_field_options",
          "fields",
          "sample_records",
          "supports_incremental",
          "suggested_display_paths"
        ],
        "title": "TableSourcePreviewResponseSchema",
        "type": "object"
      },
      "TableSourceRunSchema": {
        "description": "One import run's progress and outcome.",
        "properties": {
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Classified cause of the failure: unauthorized, rate_limited, server_unavailable, network_error, not_found, pagination_error, bad_request. NULL when the run did not fail.",
            "title": "Error Code"
          },
          "finished_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Finished At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "identity_field": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The field records were matched on during this run. Null for a run from before this was recorded; read the source's current identity_field instead in that case.",
            "title": "Identity Field"
          },
          "is_full_relist": {
            "description": "Whether this run asked the provider for everything.",
            "title": "Is Full Relist",
            "type": "boolean"
          },
          "needs_reconnect": {
            "default": false,
            "description": "Whether fixing this means reconnecting the integration. Only true for a credentials failure, so the prompt keeps its meaning.",
            "title": "Needs Reconnect",
            "type": "boolean"
          },
          "rows_created": {
            "title": "Rows Created",
            "type": "integer"
          },
          "rows_deleted": {
            "title": "Rows Deleted",
            "type": "integer"
          },
          "rows_skipped": {
            "description": "Records the run read and left out, broken down by the two counts below. Stopping at the row limit is not a skip; see stopped_at_row_limit.",
            "title": "Rows Skipped",
            "type": "integer"
          },
          "rows_skipped_duplicate": {
            "description": "Of those, records whose match value an earlier, different record in the same page already had; only the first was added.",
            "title": "Rows Skipped Duplicate",
            "type": "integer"
          },
          "rows_skipped_no_identity": {
            "description": "Of those, records that came back with no value for the field rows are matched on, so there was no row for them to be.",
            "title": "Rows Skipped No Identity",
            "type": "integer"
          },
          "rows_updated": {
            "title": "Rows Updated",
            "type": "integer"
          },
          "source_id": {
            "format": "uuid",
            "title": "Source Id",
            "type": "string"
          },
          "started_at": {
            "format": "date-time",
            "title": "Started At",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/TableSourceRunStatus"
          },
          "stopped_at_row_limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The row limit this run stopped at with records still unread in the tool; null when it read everything it was asked for. Raising the source's row_limit brings the rest in.",
            "title": "Stopped At Row Limit"
          },
          "sweep_deletions": {
            "description": "Whether this run was asked to delete rows whose records are gone from the tool. A run that stopped at a row limit (stopped_at_row_limit) deletes nothing, because it has not read the whole tool.",
            "title": "Sweep Deletions",
            "type": "boolean"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "trigger": {
            "$ref": "#/components/schemas/TableSourceRunTrigger"
          }
        },
        "required": [
          "id",
          "table_id",
          "source_id",
          "status",
          "trigger",
          "is_full_relist",
          "sweep_deletions",
          "identity_field",
          "rows_created",
          "rows_updated",
          "rows_deleted",
          "rows_skipped",
          "rows_skipped_no_identity",
          "rows_skipped_duplicate",
          "stopped_at_row_limit",
          "error",
          "started_at",
          "finished_at"
        ],
        "title": "TableSourceRunSchema",
        "type": "object"
      },
      "TableSourceRunSkipSchema": {
        "description": "One record an import run read and left out, and why.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "How to find the record in the tool: its name or email, else another of its ids. Null when it carried none.",
            "title": "Label"
          },
          "match_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For a duplicate, the match value it shares with an earlier record.",
            "title": "Match Value"
          },
          "reason": {
            "$ref": "#/components/schemas/TableSourceSkipReason",
            "description": "Why it was left out: `no_identity` when it came back with no value for the field rows are matched on, `duplicate_in_page` when an earlier, different record in the same page had its match value."
          }
        },
        "required": [
          "id",
          "reason",
          "label",
          "match_value",
          "created_at"
        ],
        "title": "TableSourceRunSkipSchema",
        "type": "object"
      },
      "TableSourceRunStatus": {
        "description": "Where one import run has got to.\n\nThe terminal states are absorbing: a run never leaves them. There is no\nPENDING here. Unlike a CSV upload, which sits parsed and uncommitted until\nthe user says go, a source run is only ever created at the moment something\ndecides to run it.\n\nCANCELLING is a request, not an outcome. Stopping an import is a database\nstatus flip the workflow observes between pages, never a Temporal terminate:\na terminate could land mid-page and leave rows half-written with nothing to\nsettle the run, which is exactly the stuck state that blocks every future\nrefresh of the table.",
        "enum": [
          "running",
          "cancelling",
          "cancelled",
          "succeeded",
          "failed"
        ],
        "title": "TableSourceRunStatus",
        "type": "string"
      },
      "TableSourceRunTrigger": {
        "description": "What asked for a run.",
        "enum": [
          "initial",
          "manual",
          "scheduled"
        ],
        "title": "TableSourceRunTrigger",
        "type": "string"
      },
      "TableSourceSchema": {
        "description": "A table's import source.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "identity_field": {
            "title": "Identity Field",
            "type": "string"
          },
          "integration_id": {
            "format": "uuid",
            "title": "Integration Id",
            "type": "string"
          },
          "integration_type": {
            "title": "Integration Type",
            "type": "string"
          },
          "last_synced_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Start of the last successful run; the incremental watermark.",
            "title": "Last Synced At"
          },
          "object_column_id": {
            "description": "The column each imported record lands in.",
            "format": "uuid",
            "title": "Object Column Id",
            "type": "string"
          },
          "record_type": {
            "title": "Record Type",
            "type": "string"
          },
          "record_type_label": {
            "description": "The object type's name for a person to read ('Contacts', 'Event type').",
            "title": "Record Type Label",
            "type": "string"
          },
          "row_limit": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Row Limit"
          },
          "supports_incremental": {
            "title": "Supports Incremental",
            "type": "boolean"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "table_id",
          "integration_id",
          "integration_type",
          "record_type",
          "record_type_label",
          "row_limit",
          "object_column_id",
          "identity_field",
          "last_synced_at",
          "supports_incremental",
          "created_at",
          "updated_at"
        ],
        "title": "TableSourceSchema",
        "type": "object"
      },
      "TableSourceSkipReason": {
        "description": "Why an import read one of the tool's records and left it out of the table.\n\nPer record, and only for records the run actually read. Stopping at the\nrow limit is deliberately NOT one of these: the records past the limit were\nnever read (most tools are asked for exactly the room left), so how many\nthere are is unknowable and which ones is an accident of page size. A run\nrecords THAT it stopped (``stopped_at_row_limit``) instead.\n\n``DUPLICATE`` is a different record carrying a match value an earlier one\nin the same page already has. The provider returning one record twice is\nnot a skip: the record is in the table.",
        "enum": [
          "no_identity",
          "duplicate_in_page"
        ],
        "title": "TableSourceSkipReason",
        "type": "string"
      },
      "TableStatsSchema": {
        "description": "Aggregate stats for one table, composed from three downward reads.",
        "properties": {
          "active_run": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRunReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The newest active run, when one exists."
          },
          "at_row_cap": {
            "description": "Whether the table has reached its row cap.",
            "title": "At Row Cap",
            "type": "boolean"
          },
          "cell_settlement_by_column": {
            "additionalProperties": {
              "$ref": "#/components/schemas/CellSettlementSchema"
            },
            "description": "How each column's cells ended, per column ID. A column with no cells is absent; read absence as zero across every figure.\n\nThe completeness read. `filled_cells_by_column` and `failed_cells_by_column` are both projections of this and are kept only so an existing API-key client does not break.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Cell Settlement By Column",
            "type": "object"
          },
          "columns_by_kind": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Number of columns per column kind (manual/formula).",
            "title": "Columns By Kind",
            "type": "object"
          },
          "failed_cells": {
            "description": "Cells currently carrying an evaluation error.",
            "title": "Failed Cells",
            "type": "integer"
          },
          "failed_cells_by_column": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Errored cells per column ID. A column with no failures is absent; read absence as zero. What the column header's error badge shows.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Failed Cells By Column",
            "type": "object"
          },
          "failed_rows_blocked_by_column": {
            "additionalProperties": {
              "type": "boolean"
            },
            "description": "Per column ID with failed cells: true when every failed row in it is waiting for sources that are still unavailable, so Run failed rows has nothing to re-run there until they are back. A column with no failures is absent.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Failed Rows Blocked By Column",
            "type": "object"
          },
          "filled_cells_by_column": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Cells holding a stored value, per column ID. A column with no filled cells is absent; read absence as zero. How much of the column has DATA in it, which is not how much of it is DONE. For that, and for the breakdown behind it, read `cell_settlement_by_column`.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Filled Cells By Column",
            "type": "object"
          },
          "last_run_at_by_column": {
            "additionalProperties": {
              "format": "date-time",
              "type": "string"
            },
            "description": "When each column last produced a value. Derived from its newest computed cell. A column absent here has never run. Not the column's updated_at, which moves when it is merely renamed.",
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Last Run At By Column",
            "type": "object"
          },
          "last_updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When anyone last added a row to the table or wrote a value in it: the newest of its rows' Last updated, as the grid's Last updated column reads each row. Null for a table with no rows. Not the table's updated_at, which moves on a rename or a move and never on an edited value. Deleted rows leave no trace in it.",
            "title": "Last Updated At"
          },
          "row_count": {
            "title": "Row Count",
            "type": "integer"
          }
        },
        "required": [
          "row_count",
          "columns_by_kind",
          "failed_cells",
          "failed_cells_by_column",
          "filled_cells_by_column",
          "active_run",
          "at_row_cap"
        ],
        "title": "TableStatsSchema",
        "type": "object"
      },
      "TableStatusSchema": {
        "description": "A point-in-time snapshot: active runs plus the four change watermarks.",
        "properties": {
          "active_runs": {
            "description": "Every active (pending/running/cancelling) run, newest first.",
            "items": {
              "$ref": "#/components/schemas/TableRunReadSchema"
            },
            "title": "Active Runs",
            "type": "array"
          },
          "columns": {
            "$ref": "#/components/schemas/TableColumnsWatermarkSchema"
          },
          "last_finished_run": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRunReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The newest run that has finished, whatever its outcome. Present so a client can distinguish a table whose last run FAILED from one that is simply idle. Before this, both answered with no runs at all and the footer reported the table up to date moments after a run failed."
          },
          "paused_runs": {
            "description": "Runs most recently stopped because the credit balance ran out mid-run: terminal, but the grid's most important fact until a fresh run supersedes them. Empty when nothing is paused.",
            "items": {
              "$ref": "#/components/schemas/TableRunReadSchema"
            },
            "title": "Paused Runs",
            "type": "array"
          },
          "rows": {
            "$ref": "#/components/schemas/TableRowsWatermarkSchema"
          },
          "table_updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The definition's updated_at. Moves on rename/description edits AND on row-count maintenance (the counter lives on the definition row), so not a rename-only signal. Null only for an unknown table (the no-leak empty status).",
            "title": "Table Updated At"
          },
          "ui_prefs": {
            "$ref": "#/components/schemas/TableUIPrefsWatermarkSchema",
            "description": "Watermark of the team's display preferences: moves on a recolour, or on an API key's hide, pin or resize. A person's own hide, pin or resize is theirs alone and moves nothing here. Deliberately separate from `columns`: a display change must refresh the column list alone, never the rows page and stats that a definition change refreshes."
          }
        },
        "required": [
          "active_runs",
          "rows",
          "columns",
          "ui_prefs",
          "table_updated_at"
        ],
        "title": "TableStatusSchema",
        "type": "object"
      },
      "TableStoppedRunsResponseSchema": {
        "description": "What the global Stop Run action reached: runs flipped, and requests withdrawn.",
        "properties": {
          "cancelled_run_ids": {
            "description": "IDs of the runs flipped to cancelling; empty when nothing was active.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Cancelled Run Ids",
            "type": "array"
          },
          "updated": {
            "description": "How many runs were flipped to cancelling.",
            "title": "Updated",
            "type": "integer"
          },
          "withdrawn_request_ids": {
            "description": "Request ids (as `POST .../runs/` answered them) of runs asked for that had not started yet, withdrawn so they never start; empty when none was waiting.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Withdrawn Request Ids",
            "type": "array"
          }
        },
        "required": [
          "updated",
          "cancelled_run_ids",
          "withdrawn_request_ids"
        ],
        "title": "TableStoppedRunsResponseSchema",
        "type": "object"
      },
      "TableTextSimilarity-Input": {
        "description": "How alike two pieces of text are, as a percentage.\n\nThe dedupe and match question: is \"Acme Inc.\" the same company as \"Acme,\nInc\"? An exact comparison says no and a human says obviously yes, so the\nhonest answer is a number the row can threshold on.\n\nCase and surrounding whitespace never count: they are formatting, not\ndifference. 100 means identical after that normalisation, 0 means nothing\nin common.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "text_similarity",
            "default": "text_similarity",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "other": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Other"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableTextSimilarity",
        "type": "object"
      },
      "TableTextSimilarity-Output": {
        "description": "How alike two pieces of text are, as a percentage.\n\nThe dedupe and match question: is \"Acme Inc.\" the same company as \"Acme,\nInc\"? An exact comparison says no and a human says obviously yes, so the\nhonest answer is a number the row can threshold on.\n\nCase and surrounding whitespace never count: they are formatting, not\ndifference. 100 means identical after that normalisation, 0 means nothing\nin common.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "text_similarity",
            "default": "text_similarity",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "other": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ColumnRef"
              },
              {
                "$ref": "#/components/schemas/StepRef"
              },
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Other"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableTextSimilarity",
        "type": "object"
      },
      "TableToBool-Input": {
        "description": "Coerce the input to a boolean.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_bool",
            "default": "to_bool",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToBool",
        "type": "object"
      },
      "TableToBool-Output": {
        "description": "Coerce the input to a boolean.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_bool",
            "default": "to_bool",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToBool",
        "type": "object"
      },
      "TableToDate-Input": {
        "description": "Coerce the input to a date.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_date",
            "default": "to_date",
            "title": "Function",
            "type": "string"
          },
          "input_format": {
            "default": "auto",
            "enum": [
              "iso",
              "unix",
              "unix_ms",
              "auto"
            ],
            "title": "Input Format",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToDate",
        "type": "object"
      },
      "TableToDate-Output": {
        "description": "Coerce the input to a date.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_date",
            "default": "to_date",
            "title": "Function",
            "type": "string"
          },
          "input_format": {
            "default": "auto",
            "enum": [
              "iso",
              "unix",
              "unix_ms",
              "auto"
            ],
            "title": "Input Format",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToDate",
        "type": "object"
      },
      "TableToFloat-Input": {
        "description": "Coerce the input to a float.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_float",
            "default": "to_float",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToFloat",
        "type": "object"
      },
      "TableToFloat-Output": {
        "description": "Coerce the input to a float.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_float",
            "default": "to_float",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToFloat",
        "type": "object"
      },
      "TableToInt-Input": {
        "description": "Coerce the input to an integer.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_int",
            "default": "to_int",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToInt",
        "type": "object"
      },
      "TableToInt-Output": {
        "description": "Coerce the input to an integer.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_int",
            "default": "to_int",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToInt",
        "type": "object"
      },
      "TableToString-Input": {
        "description": "Coerce the input to a string.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_string",
            "default": "to_string",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToString",
        "type": "object"
      },
      "TableToString-Output": {
        "description": "Coerce the input to a string.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "to_string",
            "default": "to_string",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableToString",
        "type": "object"
      },
      "TableTrim-Input": {
        "description": "Strip leading and trailing whitespace from a string value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "trim",
            "default": "trim",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableTrim",
        "type": "object"
      },
      "TableTrim-Output": {
        "description": "Strip leading and trailing whitespace from a string value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "trim",
            "default": "trim",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableTrim",
        "type": "object"
      },
      "TableType": {
        "description": "What one row of a table stands for: a person, a company, or anything else.\n\nPersisted in a String(16) column. A table somebody makes by hand, loads\nfrom a file or fills from a connected tool is OTHER until a person says\nwhat it holds; a table a lead search fills takes the search's answer, and\nwhile a person or company search fills it, only the search can change it.",
        "enum": [
          "person",
          "company",
          "other"
        ],
        "title": "TableType",
        "type": "string"
      },
      "TableUIPrefsChangedEventSchema": {
        "description": "Display preferences changed. Refetch the column list ALONE.\n\nSeparate from ``columns_changed`` for the same reason the status watermarks\nare separate: a hide, pin, resize, or recolour must never refetch the rows\npage and stats that a definition change refetches.",
        "properties": {
          "kind": {
            "const": "ui_prefs_changed",
            "default": "ui_prefs_changed",
            "title": "Kind",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id"
        ],
        "title": "TableUIPrefsChangedEventSchema",
        "type": "object"
      },
      "TableUIPrefsWatermarkSchema": {
        "description": "The display-preferences change watermark: stored row count plus newest write.",
        "properties": {
          "count": {
            "description": "Number of columns with customised display preferences.",
            "title": "Count",
            "type": "integer"
          },
          "max_updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Newest updated_at of the team's preferences; null when no column is customised. Moves on a recolour, or an API key's hide, pin or resize (a person's own layout is theirs alone and moves nothing here); resets move `count` and can move this backward. Compare for inequality, never ordering.",
            "title": "Max Updated At"
          }
        },
        "required": [
          "count",
          "max_updated_at"
        ],
        "title": "TableUIPrefsWatermarkSchema",
        "type": "object"
      },
      "TableUpdateSchema": {
        "description": "Request body for updating a table (tri-state PATCH semantics).",
        "properties": {
          "auto_run": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Whether data changes (cell edits, new rows) request recompute runs by themselves. Off, formula cells go stale and wait for an explicit run.",
            "title": "Auto Run"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New description. Set to null to clear.",
            "title": "Description"
          },
          "keep_existing_results": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Whether a manual run-all skips cells that already hold a good value, touching only the errored, empty and stale ones. Off re-runs every cell in scope.",
            "title": "Keep Existing Results"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "title": "Name"
          },
          "shared_as_template": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "Publish this table's SHAPE (its columns, their configuration and what each column holds) to anyone with the link, with no sign-in. Never a row or a cell value. Off by default.",
            "title": "Shared As Template"
          },
          "table_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableType"
              },
              {}
            ],
            "description": "What one row stands for: a person, a company or other. While a lead search for people or companies fills the table (`table_type_set_by_search`), the search says what its rows are, and another type is refused until it is removed.",
            "title": "Table Type"
          }
        },
        "title": "TableUpdateSchema",
        "type": "object"
      },
      "TableUriEncode-Input": {
        "description": "Percent-encode a value so it survives being put in a URL.\n\nEvery search-URL column builds the same thing (a query string with a\ncompany name in it) and every one of them breaks on the first ampersand\nor accent. Encoding belongs one step before the URL is assembled, not in\na regex chain that handles the four characters someone remembered.\n\n``component`` escapes everything reserved, which is what a query value\nneeds; ``full`` leaves ``:/?#`` alone so an entire URL stays usable.\nLists are encoded item by item.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "uri_encode",
            "default": "uri_encode",
            "title": "Function",
            "type": "string"
          },
          "mode": {
            "default": "component",
            "enum": [
              "component",
              "full"
            ],
            "title": "Mode",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableUriEncode",
        "type": "object"
      },
      "TableUriEncode-Output": {
        "description": "Percent-encode a value so it survives being put in a URL.\n\nEvery search-URL column builds the same thing (a query string with a\ncompany name in it) and every one of them breaks on the first ampersand\nor accent. Encoding belongs one step before the URL is assembled, not in\na regex chain that handles the four characters someone remembered.\n\n``component`` escapes everything reserved, which is what a query value\nneeds; ``full`` leaves ``:/?#`` alone so an entire URL stays usable.\nLists are encoded item by item.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "uri_encode",
            "default": "uri_encode",
            "title": "Function",
            "type": "string"
          },
          "mode": {
            "default": "component",
            "enum": [
              "component",
              "full"
            ],
            "title": "Mode",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableUriEncode",
        "type": "object"
      },
      "TableUrlDomain-Input": {
        "description": "Reduce a URL to its bare registrable-looking host.\n\nA website field arrives as a whole URL (``https://www.acme.com/about``)\nbut the thing that joins, dedupes and enriches is ``acme.com``. Doing it\nwith ``regex_extract`` means every caller hand-writes the same fragile\npattern, so the parse lives here once and uses a real URL parser.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "url_domain",
            "default": "url_domain",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableUrlDomain",
        "type": "object"
      },
      "TableUrlDomain-Output": {
        "description": "Reduce a URL to its bare registrable-looking host.\n\nA website field arrives as a whole URL (``https://www.acme.com/about``)\nbut the thing that joins, dedupes and enriches is ``acme.com``. Doing it\nwith ``regex_extract`` means every caller hand-writes the same fragile\npattern, so the parse lives here once and uses a real URL parser.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "url_domain",
            "default": "url_domain",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableUrlDomain",
        "type": "object"
      },
      "TableUrlValid-Input": {
        "description": "Whether a value is a usable web address.\n\nThe gate in front of every scrape, screenshot and HTTP column: a row whose\n\"website\" cell holds \"n/a\", \"coming soon\" or a bare company name should\nnever spend a credit finding that out. True means the value parses as a\nhost with a real-looking domain, not that the site answers. A formula\ncannot make a request, and pretending otherwise would be the one dishonest\nthing this function could do.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "url_valid",
            "default": "url_valid",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "require_scheme": {
            "default": false,
            "description": "Demand http:// or https://; off accepts a bare domain.",
            "title": "Require Scheme",
            "type": "boolean"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableUrlValid",
        "type": "object"
      },
      "TableUrlValid-Output": {
        "description": "Whether a value is a usable web address.\n\nThe gate in front of every scrape, screenshot and HTTP column: a row whose\n\"website\" cell holds \"n/a\", \"coming soon\" or a bare company name should\nnever spend a credit finding that out. True means the value parses as a\nhost with a real-looking domain, not that the site answers. A formula\ncannot make a request, and pretending otherwise would be the one dishonest\nthing this function could do.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "url_valid",
            "default": "url_valid",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "require_scheme": {
            "default": false,
            "description": "Demand http:// or https://; off accepts a bare domain.",
            "title": "Require Scheme",
            "type": "boolean"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "title": "TableUrlValid",
        "type": "object"
      },
      "TableUserPrefsReadSchema": {
        "description": "One user's relationship with one table.\n\nPer-USER: two people in the same organisation are meant to disagree about\nwhat they have starred.",
        "properties": {
          "is_favorite": {
            "description": "Whether this user starred the table.",
            "title": "Is Favorite",
            "type": "boolean"
          },
          "last_viewed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this user last opened the table; null means never.",
            "title": "Last Viewed At"
          }
        },
        "required": [
          "is_favorite",
          "last_viewed_at"
        ],
        "title": "TableUserPrefsReadSchema",
        "type": "object"
      },
      "TableUtmParse-Input": {
        "description": "Extract a UTM parameter from a URL value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "utm_parse",
            "default": "utm_parse",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "parameter": {
            "enum": [
              "source",
              "medium",
              "campaign",
              "term",
              "content"
            ],
            "title": "Parameter",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "parameter"
        ],
        "title": "TableUtmParse",
        "type": "object"
      },
      "TableUtmParse-Output": {
        "description": "Extract a UTM parameter from a URL value.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "utm_parse",
            "default": "utm_parse",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "parameter": {
            "enum": [
              "source",
              "medium",
              "campaign",
              "term",
              "content"
            ],
            "title": "Parameter",
            "type": "string"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "parameter"
        ],
        "title": "TableUtmParse",
        "type": "object"
      },
      "TableValueMapping-Input": {
        "description": "Map input values through a lookup table.",
        "properties": {
          "default_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Value"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "value_mapping",
            "default": "value_mapping",
            "title": "Function",
            "type": "string"
          },
          "mapping": {
            "additionalProperties": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "title": "Mapping",
            "type": "object"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "mapping"
        ],
        "title": "TableValueMapping",
        "type": "object"
      },
      "TableValueMapping-Output": {
        "description": "Map input values through a lookup table.",
        "properties": {
          "default_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default Value"
          },
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "value_mapping",
            "default": "value_mapping",
            "title": "Function",
            "type": "string"
          },
          "mapping": {
            "additionalProperties": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "title": "Mapping",
            "type": "object"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          }
        },
        "required": [
          "mapping"
        ],
        "title": "TableValueMapping",
        "type": "object"
      },
      "TableViewCreateSchema": {
        "description": "Request body for creating a saved view.",
        "properties": {
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "hidden_column_ids": {
            "description": "Columns the view hides.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 500,
            "title": "Hidden Column Ids",
            "type": "array"
          },
          "is_default": {
            "default": false,
            "description": "Make this the table's default view: the one a link naming no view opens on, for a person with no last view of the table. Stands down whichever view held it; at most one view per table carries it.",
            "title": "Is Default",
            "type": "boolean"
          },
          "name": {
            "description": "View name, unique per table.",
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "position": {
            "default": 0,
            "description": "Display position in the view switcher; ties break by name.",
            "minimum": 0.0,
            "title": "Position",
            "type": "integer"
          },
          "sorts": {
            "description": "Order rows by these columns, in priority order.",
            "items": {
              "$ref": "#/components/schemas/TableRowSortSchema"
            },
            "maxItems": 3,
            "title": "Sorts",
            "type": "array"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "Predicate tree rows must satisfy while the view is applied."
          }
        },
        "required": [
          "name"
        ],
        "title": "TableViewCreateSchema",
        "type": "object"
      },
      "TableViewReadSchema": {
        "description": "A saved view: named sort/filter/hidden-column overrides for one table.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "hidden_column_ids": {
            "description": "Columns the view hides.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Hidden Column Ids",
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_default": {
            "description": "Whether opening the table with no view named applies this one, for a person with no last view of the table. At most one view per table carries it.",
            "title": "Is Default",
            "type": "boolean"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "position": {
            "description": "Display position in the view switcher; ties break by name.",
            "title": "Position",
            "type": "integer"
          },
          "sorts": {
            "description": "The view's sort keys, in priority order.",
            "items": {
              "$ref": "#/components/schemas/TableRowSortSchema"
            },
            "title": "Sorts",
            "type": "array"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "Predicate tree rows must satisfy while the view is applied."
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "position",
          "is_default",
          "sorts",
          "where",
          "hidden_column_ids",
          "created_at",
          "updated_at"
        ],
        "title": "TableViewReadSchema",
        "type": "object"
      },
      "TableViewSequenceImpactListSchema": {
        "description": "Every unfinished sequence that reads its contacts through the view, by id.",
        "properties": {
          "sequences": {
            "items": {
              "$ref": "#/components/schemas/TableViewSequenceImpactSchema"
            },
            "title": "Sequences",
            "type": "array"
          }
        },
        "required": [
          "sequences"
        ],
        "title": "TableViewSequenceImpactListSchema",
        "type": "object"
      },
      "TableViewSequenceImpactRequestSchema": {
        "description": "The filter a view would be saved with, to count what it does to its sequences.",
        "properties": {
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "The filter as it would be saved. Null for no filter."
          }
        },
        "title": "TableViewSequenceImpactRequestSchema",
        "type": "object"
      },
      "TableViewSequenceImpactSchema": {
        "description": "What saving the filter does to one sequence that reads its contacts through the view.",
        "properties": {
          "capped": {
            "description": "The view matches more rows than the counts read; added is at least this. Removed and not changed are exact.",
            "title": "Capped",
            "type": "boolean"
          },
          "diff": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AudienceDiffReadSchema"
              },
              {
                "type": "null"
              }
            ]
          },
          "follows_table": {
            "description": "The sequence keeps in sync with the table. A fixed list ignores a filter edited here, so it has no diff.",
            "title": "Follows Table",
            "type": "boolean"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "sequence_id": {
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/SequenceStatus"
          }
        },
        "required": [
          "sequence_id",
          "name",
          "status",
          "follows_table",
          "diff",
          "capped"
        ],
        "title": "TableViewSequenceImpactSchema",
        "type": "object"
      },
      "TableViewUpdateSchema": {
        "description": "Request body for updating a saved view (tri-state PATCH semantics).",
        "properties": {
          "description": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "New description. Set to null to clear.",
            "title": "Description"
          },
          "hidden_column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "maxItems": 500,
                "type": "array"
              },
              {}
            ],
            "title": "Hidden Column Ids"
          },
          "is_default": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "True makes this the table's default view (the one a link naming no view opens on, for a person with no last view of the table), standing down whichever view held it. False clears the flag, leaving the table with no default.",
            "title": "Is Default"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {}
            ],
            "title": "Name"
          },
          "position": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {}
            ],
            "title": "Position"
          },
          "sorts": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/TableRowSortSchema"
                },
                "maxItems": 3,
                "type": "array"
              },
              {}
            ],
            "description": "New sort keys, in priority order. Empty restores display order.",
            "title": "Sorts"
          },
          "where": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableRowsWhereSchema-Input"
              },
              {},
              {
                "type": "null"
              }
            ],
            "title": "Where"
          }
        },
        "title": "TableViewUpdateSchema",
        "type": "object"
      },
      "TableWeightedRoundRobin-Input": {
        "description": "Assign each row to an owner, in proportion to each owner's share.\n\nThe version real teams need: a senior rep takes three leads for every one\na new hire gets, one region absorbs twice the volume of another. Shares are\nwhole numbers and mean exactly what they look like: 3 and 1 is three\nquarters and one quarter.\n\nStable per row for the same reason ``round_robin`` is: the owner comes from\na hash of the row's identity, so nothing already assigned moves when the\ntable grows or the view is sorted. Changing the SHARES does move rows,\nbecause that is what changing them means.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "weighted_round_robin",
            "default": "weighted_round_robin",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Input",
                    "change_case": "#/components/schemas/TableChangeCase-Input",
                    "clamp": "#/components/schemas/TableClamp-Input",
                    "coalesce": "#/components/schemas/TableCoalesce-Input",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Input",
                    "concatenate": "#/components/schemas/TableConcatenate-Input",
                    "conditions": "#/components/schemas/TableConditions-Input",
                    "copy": "#/components/schemas/TableCopy-Input",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Input",
                    "date_diff": "#/components/schemas/TableDateDiff-Input",
                    "date_extract": "#/components/schemas/TableDateExtract-Input",
                    "date_format": "#/components/schemas/TableDateFormat-Input",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Input",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Input",
                    "format": "#/components/schemas/TableFormat-Input",
                    "get_path": "#/components/schemas/TableGetPath-Input",
                    "hash": "#/components/schemas/TableHash-Input",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Input",
                    "keywords": "#/components/schemas/TableKeywords-Input",
                    "list_count": "#/components/schemas/TableListCount-Input",
                    "list_filter": "#/components/schemas/TableListFilter-Input",
                    "list_first": "#/components/schemas/TableListFirst-Input",
                    "list_intersect": "#/components/schemas/TableListIntersect-Input",
                    "list_join": "#/components/schemas/TableListJoin-Input",
                    "list_last": "#/components/schemas/TableListLast-Input",
                    "list_nth": "#/components/schemas/TableListNth-Input",
                    "list_pluck": "#/components/schemas/TableListPluck-Input",
                    "list_sort": "#/components/schemas/TableListSort-Input",
                    "list_split": "#/components/schemas/TableListSplit-Input",
                    "list_unique": "#/components/schemas/TableListUnique-Input",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Input",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Input",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Input",
                    "replace": "#/components/schemas/TableReplace-Input",
                    "round": "#/components/schemas/TableRound-Input",
                    "round_robin": "#/components/schemas/TableRoundRobin-Input",
                    "score_words": "#/components/schemas/TableScoreWords-Input",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Input",
                    "to_bool": "#/components/schemas/TableToBool-Input",
                    "to_date": "#/components/schemas/TableToDate-Input",
                    "to_float": "#/components/schemas/TableToFloat-Input",
                    "to_int": "#/components/schemas/TableToInt-Input",
                    "to_string": "#/components/schemas/TableToString-Input",
                    "trim": "#/components/schemas/TableTrim-Input",
                    "uri_encode": "#/components/schemas/TableUriEncode-Input",
                    "url_domain": "#/components/schemas/TableUrlDomain-Input",
                    "url_valid": "#/components/schemas/TableUrlValid-Input",
                    "utm_parse": "#/components/schemas/TableUtmParse-Input",
                    "value_mapping": "#/components/schemas/TableValueMapping-Input",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Input"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Input"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Input"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "weights": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Owner to share, e.g. {'ada': 3, 'grace': 1}.",
            "title": "Weights",
            "type": "object"
          }
        },
        "title": "TableWeightedRoundRobin",
        "type": "object"
      },
      "TableWeightedRoundRobin-Output": {
        "description": "Assign each row to an owner, in proportion to each owner's share.\n\nThe version real teams need: a senior rep takes three leads for every one\na new hire gets, one region absorbs twice the volume of another. Shares are\nwhole numbers and mean exactly what they look like: 3 and 1 is three\nquarters and one quarter.\n\nStable per row for the same reason ``round_robin`` is: the owner comes from\na hash of the row's identity, so nothing already assigned moves when the\ntable grows or the view is sorted. Changing the SHARES does move rows,\nbecause that is what changing them means.",
        "properties": {
          "failure_mode": {
            "$ref": "#/components/schemas/TableFailureMode",
            "default": "set_null"
          },
          "fallback_value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fallback Value"
          },
          "function": {
            "const": "weighted_round_robin",
            "default": "weighted_round_robin",
            "title": "Function",
            "type": "string"
          },
          "next": {
            "anyOf": [
              {
                "discriminator": {
                  "mapping": {
                    "arithmetic": "#/components/schemas/TableArithmetic-Output",
                    "change_case": "#/components/schemas/TableChangeCase-Output",
                    "clamp": "#/components/schemas/TableClamp-Output",
                    "coalesce": "#/components/schemas/TableCoalesce-Output",
                    "company_domain": "#/components/schemas/TableCompanyDomain-Output",
                    "concatenate": "#/components/schemas/TableConcatenate-Output",
                    "conditions": "#/components/schemas/TableConditions-Output",
                    "copy": "#/components/schemas/TableCopy-Output",
                    "date_arithmetic": "#/components/schemas/TableDateArithmetic-Output",
                    "date_diff": "#/components/schemas/TableDateDiff-Output",
                    "date_extract": "#/components/schemas/TableDateExtract-Output",
                    "date_format": "#/components/schemas/TableDateFormat-Output",
                    "detect_language": "#/components/schemas/TableDetectLanguage-Output",
                    "email_permutations": "#/components/schemas/TableEmailPermutations-Output",
                    "format": "#/components/schemas/TableFormat-Output",
                    "get_path": "#/components/schemas/TableGetPath-Output",
                    "hash": "#/components/schemas/TableHash-Output",
                    "if_then_else": "#/components/schemas/TableIfThenElse-Output",
                    "keywords": "#/components/schemas/TableKeywords-Output",
                    "list_count": "#/components/schemas/TableListCount-Output",
                    "list_filter": "#/components/schemas/TableListFilter-Output",
                    "list_first": "#/components/schemas/TableListFirst-Output",
                    "list_intersect": "#/components/schemas/TableListIntersect-Output",
                    "list_join": "#/components/schemas/TableListJoin-Output",
                    "list_last": "#/components/schemas/TableListLast-Output",
                    "list_nth": "#/components/schemas/TableListNth-Output",
                    "list_pluck": "#/components/schemas/TableListPluck-Output",
                    "list_sort": "#/components/schemas/TableListSort-Output",
                    "list_split": "#/components/schemas/TableListSplit-Output",
                    "list_unique": "#/components/schemas/TableListUnique-Output",
                    "phone_e164": "#/components/schemas/TablePhoneE164-Output",
                    "regex_extract": "#/components/schemas/TableRegexExtract-Output",
                    "regex_replace": "#/components/schemas/TableRegexReplace-Output",
                    "replace": "#/components/schemas/TableReplace-Output",
                    "round": "#/components/schemas/TableRound-Output",
                    "round_robin": "#/components/schemas/TableRoundRobin-Output",
                    "score_words": "#/components/schemas/TableScoreWords-Output",
                    "text_similarity": "#/components/schemas/TableTextSimilarity-Output",
                    "to_bool": "#/components/schemas/TableToBool-Output",
                    "to_date": "#/components/schemas/TableToDate-Output",
                    "to_float": "#/components/schemas/TableToFloat-Output",
                    "to_int": "#/components/schemas/TableToInt-Output",
                    "to_string": "#/components/schemas/TableToString-Output",
                    "trim": "#/components/schemas/TableTrim-Output",
                    "uri_encode": "#/components/schemas/TableUriEncode-Output",
                    "url_domain": "#/components/schemas/TableUrlDomain-Output",
                    "url_valid": "#/components/schemas/TableUrlValid-Output",
                    "utm_parse": "#/components/schemas/TableUtmParse-Output",
                    "value_mapping": "#/components/schemas/TableValueMapping-Output",
                    "weighted_round_robin": "#/components/schemas/TableWeightedRoundRobin-Output"
                  },
                  "propertyName": "function"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TableCopy-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableChangeCase-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTrim-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRegexReplace-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConcatenate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRound-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableClamp-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateExtract-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateArithmetic-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFirst-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListLast-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListNth-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListJoin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListCount-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListPluck-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListUnique-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSplit-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCoalesce-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableIfThenElse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableConditions-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableValueMapping-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToString-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToInt-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToFloat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToBool-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableToDate-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TablePhoneE164-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUtmParse-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableCompanyDomain-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableGetPath-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableFormat-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDateDiff-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableKeywords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListFilter-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListSort-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableListIntersect-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableTextSimilarity-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableDetectLanguage-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableScoreWords-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableHash-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUriEncode-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableUrlValid-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableEmailPermutations-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableRoundRobin-Output"
                  },
                  {
                    "$ref": "#/components/schemas/TableWeightedRoundRobin-Output"
                  }
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Next"
          },
          "source_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Column Id"
          },
          "source_step": {
            "anyOf": [
              {
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Read the result of an EARLIER step, by 1-based position, instead of the step immediately before. Lets a later step fork back to an intermediate value (splitting a URL once and then using both the raw split and something derived from it), which a strict pipeline cannot express. Ignored when source_column_id is set (a column wins over a step), and ignored by functions that read their arguments rather than the piped value. None reads the previous step.",
            "title": "Source Step"
          },
          "weights": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Owner to share, e.g. {'ada': 3, 'grace': 1}.",
            "title": "Weights",
            "type": "object"
          }
        },
        "title": "TableWeightedRoundRobin",
        "type": "object"
      },
      "TaskChannel": {
        "description": "Which channel performs the task once it is allowed to run.\n\n``BROWSER`` is the one channel that performs nothing: a Browser use run\nthat settled on Needs human leaves a task for a person to pick up what the\nagent could not do (BU-08). Its contact already went on down the Needs\nhuman arm, so the task is a to-do with one verb, done, and no approval or\nrejection reaches it.",
        "enum": [
          "linkedin",
          "email",
          "browser"
        ],
        "title": "TaskChannel",
        "type": "string"
      },
      "TaskProgressState": {
        "description": "Where a task's work stands once the queue has let it go, for the Tasks page's Detail column.\n\nFiner than ``TaskStatus``, and read from the channel rather than the row:\na LinkedIn step's own phase and outcome first (the task's status can lag\nit), the contact's enrolment for an email.\n\n``QUEUED`` in its sender's line, with a forecast, or approved and about to\njoin it; ``RUNNING`` in a browser now; ``SENDING`` an approved email the\nengine is sending; ``HELD`` an approved email waiting for the sending\nwindow, pacing or a daily cap, or an approved LinkedIn step waiting for\nsomething its contact names (a connected account); ``PAUSED`` an approved\nstep on either channel that waits for its paused sequence or paused\ncontact to be resumed, in no line until then. ``WRITING`` a task Write\nagain withdrew while the agent writes its contact's words for that step\nagain, or the engine is about to ask with them: the same task comes back\nwaiting on a person. The rest are how it ended: ``SENT``, ``SKIPPED`` (not\napplicable, or passed over in the extension), ``FAILED``, ``REJECTED`` and\n``STOPPED`` (the contact was stopped under it, or it was replaced and the\nrewrite ended without asking again).",
        "enum": [
          "queued",
          "running",
          "sent",
          "skipped",
          "failed",
          "stopped",
          "rejected",
          "sending",
          "held",
          "paused",
          "writing"
        ],
        "title": "TaskProgressState",
        "type": "string"
      },
      "TaskRewrites": {
        "description": "Whether a reading of the queue lists the tasks the agent is writing again.\n\nA Needs work, or another version, writes the words of the same task again\n(Utku, 2026-10-25): the task is stored meanwhile as cancelled with the\noutcome ``regenerated``, and the same task comes back pending with the new\nwords. The Tasks page's Open tab keeps it in its place meanwhile, reading\nWriting, or failed with a retry; paused, held or failed past a retry,\nnobody can act on it, so it waits off Open until the engine asks again\n(Utku, 2026-10-28).\nWhich tasks those are is read off their contacts, so the caller\nnames them. ``HIDE`` adds none of them (a reading of cancelled tasks still\nlists them, as the cancelled tasks they are), ``INCLUDE`` lists them besides\nthe statuses asked for, ``ONLY`` lists them alone, whatever the statuses.",
        "enum": [
          "hide",
          "include",
          "only"
        ],
        "title": "TaskRewrites",
        "type": "string"
      },
      "TaskStatus": {
        "description": "Where one task stands.\n\nPENDING is waiting on a person. SCHEDULED is approved, or never needed\napproval, and is waiting on the channel to execute it: the browser to run\nthe LinkedIn step, the engine to send the email. The task is where a\nLinkedIn step's approval lives: while it is PENDING no step exists, and\nthe step is queued only once it is SCHEDULED. A LinkedIn task nobody is\nasked about (a sender on automatic, a housekeeping read, a Try click) is\nBORN scheduled, pointing at the step it queued. Who approved it is a stamp\non the row, not a status of its own.\n\nDONE, REJECTED and CANCELLED are terminal. DONE is the channel executed\nit; REJECTED is a person refused it; CANCELLED is the channel gave up on\nit (failed, skipped, expired), or the contact was stopped underneath it.",
        "enum": [
          "pending",
          "scheduled",
          "done",
          "rejected",
          "cancelled"
        ],
        "title": "TaskStatus",
        "type": "string"
      },
      "TaskSubjectSchema": {
        "description": "A task's card, and the message on it the person read.",
        "properties": {
          "kind": {
            "const": "task",
            "title": "Kind",
            "type": "string"
          },
          "outbound_message_id": {
            "format": "uuid",
            "title": "Outbound Message Id",
            "type": "string"
          },
          "task_id": {
            "format": "uuid",
            "title": "Task Id",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "task_id",
          "outbound_message_id"
        ],
        "title": "TaskSubjectSchema",
        "type": "object"
      },
      "TaskTargetSchema": {
        "description": "A Tasks card's words, and the agent's message they were written from.",
        "properties": {
          "outbound_message_id": {
            "format": "uuid",
            "title": "Outbound Message Id",
            "type": "string"
          },
          "target_kind": {
            "const": "task",
            "title": "Target Kind",
            "type": "string"
          },
          "task_id": {
            "format": "uuid",
            "title": "Task Id",
            "type": "string"
          }
        },
        "required": [
          "target_kind",
          "task_id",
          "outbound_message_id"
        ],
        "title": "TaskTargetSchema",
        "type": "object"
      },
      "TeamHeadcountFilterSchema": {
        "description": "How many of a company's employees sit in one team, as a min/max band.",
        "properties": {
          "gte": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gte"
          },
          "lte": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lte"
          },
          "team": {
            "default": "",
            "description": "The department or seniority to count, spelled the way the people search spells it: Sales, Engineering and Technical, Director.",
            "maxLength": 200,
            "title": "Team",
            "type": "string"
          }
        },
        "title": "TeamHeadcountFilterSchema",
        "type": "object"
      },
      "TemplateScope": {
        "description": "Which composer a template belongs to.\n\nA scope, not a folder: the picker filters to the surface it was opened\nfrom (with an everything view), and save-as-template stamps the surface\nit was saved from, so the library can't drift into a junk drawer.",
        "enum": [
          "sequence_step",
          "linkedin",
          "inbox_reply"
        ],
        "title": "TemplateScope",
        "type": "string"
      },
      "TemplateSegmentSchema": {
        "properties": {
          "builtin": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BuiltinVariable"
              },
              {
                "type": "null"
              }
            ]
          },
          "column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Column Id"
          },
          "kind": {
            "$ref": "#/components/schemas/SegmentKind"
          },
          "options": {
            "description": "Spintax alternatives; one is chosen per contact.",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "title": "Options",
            "type": "array"
          },
          "required": {
            "default": true,
            "title": "Required",
            "type": "boolean"
          },
          "text": {
            "default": "",
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "kind"
        ],
        "title": "TemplateSegmentSchema",
        "type": "object"
      },
      "TestSendRequestSchema": {
        "properties": {
          "changes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SequenceChangesSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A person's waiting changes: the step is sent as it will read once they are applied, which applies nothing. Left out, the step is sent as it is saved."
          },
          "mailbox_id": {
            "format": "uuid",
            "title": "Mailbox Id",
            "type": "string"
          },
          "record_id": {
            "description": "The contact the variables render against.",
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "to_address": {
            "maxLength": 320,
            "minLength": 3,
            "title": "To Address",
            "type": "string"
          }
        },
        "required": [
          "mailbox_id",
          "to_address",
          "record_id"
        ],
        "title": "TestSendRequestSchema",
        "type": "object"
      },
      "TestSendResponseSchema": {
        "properties": {
          "provider_message_id": {
            "title": "Provider Message Id",
            "type": "string"
          }
        },
        "required": [
          "provider_message_id"
        ],
        "title": "TestSendResponseSchema",
        "type": "object"
      },
      "TextFilterSchema": {
        "description": "Include and/or exclude a set of values for one text attribute.",
        "properties": {
          "exclude": {
            "items": {
              "type": "string"
            },
            "maxItems": 200,
            "title": "Exclude",
            "type": "array"
          },
          "include": {
            "items": {
              "type": "string"
            },
            "maxItems": 200,
            "title": "Include",
            "type": "array"
          }
        },
        "title": "TextFilterSchema",
        "type": "object"
      },
      "ThreadBlockedReplySchema": {
        "description": "The conversation's newest reply, which its sequence's agent wrote no draft for.",
        "properties": {
          "message_id": {
            "description": "The reply the agent wrote no draft for.",
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/ReplyBlockedReason",
            "description": "Why: `credits`, the workspace could not pay for the write; `spending_limit`, the sequence reached its spending limit; `throttled`, the AI was too busy or writing was paused; `empty_draft`, the write came to nothing usable; `rejected_before`, a person discarded a reply to it, so the agent writes no other on its own; `dormant`, it came long after the contact's sequence ended, so it was left to a person; `no_enrolment`, the contact is no longer in the sequence, so there is nothing to write from."
          }
        },
        "required": [
          "message_id",
          "reason"
        ],
        "title": "ThreadBlockedReplySchema",
        "type": "object"
      },
      "ThreadBulkUpdateResponseSchema": {
        "properties": {
          "updated": {
            "description": "How many of the conversations named were there to change.",
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "updated"
        ],
        "title": "ThreadBulkUpdateResponseSchema",
        "type": "object"
      },
      "ThreadBulkUpdateSchema": {
        "description": "The same marks changed on every conversation of a selection.",
        "properties": {
          "done": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "True marks it done now; false clears the mark.",
            "title": "Done"
          },
          "ids": {
            "description": "The conversations to change.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 200,
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          },
          "read": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "True takes it out of the triage queue; false puts it back as unread.",
            "title": "Read"
          },
          "snoozed_until": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "When it returns to the working views. Null cancels any reminder it is under.",
            "title": "Snoozed Until"
          }
        },
        "required": [
          "ids"
        ],
        "title": "ThreadBulkUpdateSchema",
        "type": "object"
      },
      "ThreadCountSchema": {
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "ThreadCountSchema",
        "type": "object"
      },
      "ThreadLabelsPutSchema": {
        "properties": {
          "label_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 50,
            "title": "Label Ids",
            "type": "array"
          }
        },
        "required": [
          "label_ids"
        ],
        "title": "ThreadLabelsPutSchema",
        "type": "object"
      },
      "ThreadLabelsSetSchema": {
        "description": "A thread's labels: the whole set, as stored.",
        "properties": {
          "data": {
            "description": "The ids of the labels on the thread.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Data",
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "title": "ThreadLabelsSetSchema",
        "type": "object"
      },
      "ThreadNoteKind": {
        "description": "What a note of a feedback session is.",
        "enum": [
          "note",
          "edit"
        ],
        "title": "ThreadNoteKind",
        "type": "string"
      },
      "ThreadOrigin": {
        "description": "Which store a thread lives in.\n\nONE MEMBER, on purpose. There were four assistants and four transcript\ntables; three were retired and there is one assistant now. The enum stays\nrather than collapsing to nothing, because `origin` is still half of how\na meta row names a thread and is still on the wire, and because a second\nstore arriving is a change to this list rather than to every signature\nthat carries it.\n\n``table``, ``find_leads`` and ``agent`` were the other three. Their rows\nare deleted by a release task in the same release that drops their\ntables: every read here coerces the column back into this enum, so a row\nnaming a member that no longer exists raises rather than being skipped.",
        "enum": [
          "chat"
        ],
        "title": "ThreadOrigin",
        "type": "string"
      },
      "ThreadQuestionCardSchema": {
        "description": "What the agent needs before it answers the conversation's reply.",
        "properties": {
          "message_id": {
            "description": "The reply the card is on; the answers name it. The conversation's newest reply: questions still open on an earlier one move here, keeping their ids.",
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          },
          "others_waiting": {
            "default": 0,
            "description": "Other conversations of the same sequence waiting on these questions that these answers, with the Q&A, would answer too: what `also_answer_waiting` on the answers writes, each a reply charged as any the agent writes. At most 20.",
            "title": "Others Waiting",
            "type": "integer"
          },
          "questions": {
            "description": "What to answer, in order; empty for `needs_person`.",
            "items": {
              "$ref": "#/components/schemas/ReplyQuestionSchema"
            },
            "title": "Questions",
            "type": "array"
          },
          "readiness": {
            "$ref": "#/components/schemas/ReplyReadiness",
            "description": "`needs_facts`: the agent asks `questions` before it writes, and answering them has it write the reply. `needs_person`: answering is a call only a person can make, so there are no questions, only `reason`."
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The AI's one or two sentences on why it asks.",
            "title": "Reason"
          },
          "saved_answer_scopes": {
            "additionalProperties": {
              "$ref": "#/components/schemas/AnswerScope"
            },
            "description": "Where each of `saved_answers` is kept, by question id: `sequence` for this reply's sequence alone, `account` for every sequence. The card starts its answer in that scope.",
            "title": "Saved Answer Scopes",
            "type": "object"
          },
          "saved_answers": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "The Q&A answer the reply's sequence reads to each question it answers already, by question id, matched on the question's words: the sequence's own answer, else the one for every sequence. The card offers it as the answer.",
            "title": "Saved Answers",
            "type": "object"
          },
          "shared_question_ids": {
            "description": "The questions here those conversations ask. Their answers must be saved to the Q&A for `also_answer_waiting` to answer them.",
            "items": {
              "type": "string"
            },
            "title": "Shared Question Ids",
            "type": "array"
          },
          "waiting_since": {
            "description": "When the reply came: the contact's wait.",
            "format": "date-time",
            "title": "Waiting Since",
            "type": "string"
          }
        },
        "required": [
          "message_id",
          "readiness",
          "questions",
          "reason",
          "waiting_since"
        ],
        "title": "ThreadQuestionCardSchema",
        "type": "object"
      },
      "ThreadReadSchema": {
        "properties": {
          "blocked_reply": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ThreadBlockedReplySchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The conversation's newest reply, which its sequence's agent would answer and wrote no draft for, and why, while nothing of ours answered it and no `question_card` asks instead: the conversation says \"No draft for this reply\", and `POST /inbox/threads/{thread_id}/blocked-reply/retry/` has the agent write it now. Only the single-thread read sets it; the list leaves it null."
          },
          "came_back": {
            "description": "Back in the Inbox because our answer went three business days unanswered: `returns_at` has passed.",
            "title": "Came Back",
            "type": "boolean"
          },
          "can_reply_on_linkedin": {
            "default": false,
            "description": "Whether an explicit channel='linkedin' reply can go out on this thread, because it carries a LinkedIn member identity and a paired account. The composer's channel toggle keys off this.",
            "title": "Can Reply On Linkedin",
            "type": "boolean"
          },
          "channel": {
            "$ref": "#/components/schemas/InboxChannel"
          },
          "contact_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contact Email"
          },
          "contact_key": {
            "title": "Contact Key",
            "type": "string"
          },
          "contact_linkedin_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's LinkedIn profile URL, when our own evidence (connection request ledger, dispatched actions, or the sequence's mapped column) names one. Only the SINGLE-thread read resolves it; the list leaves it null.",
            "title": "Contact Linkedin Url"
          },
          "contact_name": {
            "title": "Contact Name",
            "type": "string"
          },
          "contact_replied": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the contact has written back in this thread: a person's reply, never an auto-reply, a bounce or a robot's acknowledgement. False on a send nobody answered, which the working views never list. Only the thread LIST populates it; single-thread reads leave it null.",
            "title": "Contact Replied"
          },
          "contact_status_live": {
            "default": false,
            "description": "Whether the contact is still moving through the sequence (their word is one of the Audience tab's In progress words), so its follow-ups may still go out. False when it is waiting on an approval, paused, done or blocked, and on the list, which never resolves it.",
            "title": "Contact Status Live",
            "type": "boolean"
          },
          "contact_status_word": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's status in this thread's sequence, in the word the sequence's Audience tab shows for them (Finished, Failed, Paused, Replied, In progress, Needs approval...). Set with enrolment_id; only the SINGLE-thread read resolves it, the list leaves it null.",
            "title": "Contact Status Word"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "done_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a person marked the conversation done. `is_done` says whether the mark still holds.",
            "title": "Done At"
          },
          "enrolment_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The contact's enrolment in this thread's sequence, when it has one: the id the 'Resume cadence' action targets.",
            "title": "Enrolment Id"
          },
          "follow_up_expected": {
            "description": "Whether an answer of ours they leave unanswered would come back to the Inbox: the contact has written, and the verdict on their latest reply, by the classifier or a label a person set, does not say the conversation is over.",
            "title": "Follow Up Expected",
            "type": "boolean"
          },
          "has_open_questions": {
            "default": false,
            "description": "The agent asks questions before it answers a reply here, so the conversation waits in Needs approval. Only the thread LIST populates it; single-thread reads leave it False and carry `question_card` instead.",
            "title": "Has Open Questions",
            "type": "boolean"
          },
          "has_pending_draft": {
            "default": false,
            "description": "An AI reply is waiting for approval on this thread: the list row's 'Action required' mark. Only the thread LIST populates it; single-thread reads leave it False and the open conversation fetches the draft itself.",
            "title": "Has Pending Draft",
            "type": "boolean"
          },
          "has_unfinished_feedback": {
            "default": false,
            "description": "The AI reply waiting here (`pending_draft_id`) holds a feedback session nobody closed: notes were given and their changes wait for Send reply, which saves them, or Discard, which drops them. The list row's 'Unfinished feedback' chip. Only the thread LIST populates it, like `has_pending_draft`.",
            "title": "Has Unfinished Feedback",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_bounce": {
            "title": "Is Bounce",
            "type": "boolean"
          },
          "is_done": {
            "description": "Marked done, and no new message has reached us since: out of the Inbox. Their reply, or an answer of ours, arriving after the mark ends it, whatever time the message gives itself; an auto-reply, a bounce, a forward or a reply still waiting on Tasks does not.",
            "title": "Is Done",
            "type": "boolean"
          },
          "is_out_of_office": {
            "title": "Is Out Of Office",
            "type": "boolean"
          },
          "is_unread": {
            "title": "Is Unread",
            "type": "boolean"
          },
          "label_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Label Ids",
            "type": "array"
          },
          "last_message_at": {
            "format": "date-time",
            "title": "Last Message At",
            "type": "string"
          },
          "last_snippet": {
            "title": "Last Snippet",
            "type": "string"
          },
          "linkedin_account_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInAccountStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "The pairing state of the LinkedIn account this thread replies from. Anything but 'active' blocks queueing a LinkedIn reply: 'revoked' was disconnected and 'pending' never bound a member. Only the SINGLE-thread read resolves it; the list leaves it null, as does a thread with no LinkedIn account or one whose account row is gone."
          },
          "linkedin_checkpoint_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInCheckpointStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether LinkedIn is currently challenging that account. Single-thread read only; the list leaves it null."
          },
          "linkedin_last_seen_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When a browser on that account last checked in; null when none ever has. Single-thread read only; the list leaves it null.",
            "title": "Linkedin Last Seen At"
          },
          "linkedin_presence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInPresence"
              },
              {
                "type": "null"
              }
            ],
            "description": "How recently a browser on that account checked in: active, idle or not seen. Carried beside the status rather than blanked for a non-active account (the senders list does that), because the composer shows the two as separate facts. Single-thread read only; the list leaves it null."
          },
          "linkedin_queue_expiry_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Always null. The wait window was retired: a queued LinkedIn reply now waits for a person, or for a browser, without expiring. The field stays so older clients still find it; a null hides the composer's sentence about it.",
            "title": "Linkedin Queue Expiry Days"
          },
          "linkedin_sender_profile_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sender the LinkedIn account belongs to, so the composer can send a person to that sender's LinkedIn tab to reconnect. Single-thread read only; the list leaves it null.",
            "title": "Linkedin Sender Profile Id"
          },
          "listed_at": {
            "description": "The moment the list sorts this conversation by: its last message, or later when a reminder went off or, on the Inbox's own views, when it came back from silence. The time to show beside the row.",
            "format": "date-time",
            "title": "Listed At",
            "type": "string"
          },
          "mailbox_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mailbox Id"
          },
          "match_excerpt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The matched message, headlined around the match. Only set when searching.",
            "title": "Match Excerpt"
          },
          "message_count": {
            "title": "Message Count",
            "type": "integer"
          },
          "pending_draft_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which AI reply waits for approval here, by its draft id: what a bulk Approve and send names, so the reply it sends is the one that was read. Only the thread LIST populates it, like `has_pending_draft`.",
            "title": "Pending Draft Id"
          },
          "question_card": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ThreadQuestionCardSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the agent needs before it answers the conversation's newest reply it could not answer alone, while nobody answered it, the contact did not write again and the agent still writes replies to it: \"Before I draft a reply, I need to know\" with a box per question, or the reason a person must answer. Only the single-thread read sets it; the list leaves it null."
          },
          "returns_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When this conversation comes back to the Inbox if the contact stays quiet: three business days after our latest answer, at the same time of day, counted in the sender's timezone. In the past once it has come back (`came_back`). Null when it will not: they have the last word, the verdict on their latest reply, by the classifier or a label a person set, says the conversation is over (Negative, Meeting booked, Meeting completed, Closed or Wrong contact), or it is done.",
            "title": "Returns At"
          },
          "rewriting_draft": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ThreadRewritingDraftSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The reply a sequence's agent wrote, retired to be written again (a Needs work, or Write again), while it is the conversation's newest draft: nothing was written in its place yet, or the rewrite wrote nothing usable. Its thumbs-down event says which. Only the single-thread read sets it; the list leaves it null."
          },
          "sequence_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The sequence the conversation is filed under: the one its newest reply answers, else the first that wrote to the contact.",
            "title": "Sequence Id"
          },
          "snoozed_until": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Hidden from the working views until this instant.",
            "title": "Snoozed Until"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step Id"
          },
          "stop_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StopReason"
              },
              {
                "type": "null"
              }
            ],
            "description": "Set when the cadence is stopped (reply, unsubscribe, bounce, ...). None for a live or normally-completed enrolment. Only 'reply' is resumable through the sequence; 'unread_reply' is resumed from this conversation's unread-reply card."
          },
          "stop_request": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ThreadStopRequestSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The newest reply the AI read as asking never to be contacted again, while nobody undid it and it still keeps the contact on do-not-contact or stopped somewhere for good: the conversation says \"Asked not to be contacted again\" with Undo. Only the single-thread read sets it; the list leaves it null."
          },
          "subject": {
            "title": "Subject",
            "type": "string"
          },
          "unread_reply_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The reply the AI could not read, a second try included, while it is the conversation's newest reply and nothing answered it: the conversation shows \"Couldn't read this reply\" with Try again. Only the single-thread read sets it; the list leaves it null.",
            "title": "Unread Reply Id"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "waiting_since": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the reply waiting on a person here was sent: the message a waiting AI reply answers, or the oldest reply the agent's questions wait on, the older when both do. Needs approval shows it as how long the contact has waited. Only the thread LIST populates it; null when nothing waits on a person, and on single-thread reads.",
            "title": "Waiting Since"
          }
        },
        "required": [
          "id",
          "contact_email",
          "contact_key",
          "channel",
          "contact_name",
          "mailbox_id",
          "sequence_id",
          "step_id",
          "subject",
          "last_message_at",
          "last_snippet",
          "is_unread",
          "is_out_of_office",
          "is_bounce",
          "message_count",
          "label_ids",
          "created_at",
          "updated_at",
          "is_done",
          "came_back",
          "follow_up_expected",
          "listed_at"
        ],
        "title": "ThreadReadSchema",
        "type": "object"
      },
      "ThreadRewritingDraftSchema": {
        "description": "The agent's reply retired to be written again, while nothing was written in its place.",
        "properties": {
          "draft_id": {
            "description": "The retired reply, which the rewrite replaces.",
            "format": "uuid",
            "title": "Draft Id",
            "type": "string"
          },
          "learning_subject_key": {
            "description": "What a Needs work on the reply is filed under: its newest event in `GET /agent-learnings/thumbs-downs/?subject_key=` says whether the rewrite is still being written, or how it ended.",
            "title": "Learning Subject Key",
            "type": "string"
          }
        },
        "required": [
          "draft_id",
          "learning_subject_key"
        ],
        "title": "ThreadRewritingDraftSchema",
        "type": "object"
      },
      "ThreadSort": {
        "description": "The order a working inbox is read in.\n\nNEWEST is the default and what every mail client does. LONGEST_WAITING is\nthe one a sales team actually triages by: a reply that came in on Monday and\nstill has no answer on Thursday is the most expensive thing in the list, and\nnewest-first buries it under everything that has arrived since. Smartlead\nbuilds its whole SLA view on this ordering, and we had no way to reach it:\nthe list was newest-first with no alternative.\n\nDeliberately two named READINGS rather than a generic field+direction pair.\n\"Longest waiting\" is not `last_message_at asc`: an expired snooze lifts a\nthread to its wake-up time, so both orderings sort the same\ncomputed instant, and exposing the raw column would let a caller ask for an\norder that disagrees with the one the list actually uses.",
        "enum": [
          "newest",
          "longest_waiting",
          "positives_first",
          "sequence"
        ],
        "title": "ThreadSort",
        "type": "string"
      },
      "ThreadStopRequestSchema": {
        "description": "A reply the AI read as asking never to be contacted again, and what it did.",
        "properties": {
          "blocked": {
            "description": "The contact's address is on do-not-contact because of this reply.",
            "title": "Blocked",
            "type": "boolean"
          },
          "message_id": {
            "description": "The reply read as a stop request; Undo names it.",
            "format": "uuid",
            "title": "Message Id",
            "type": "string"
          },
          "sequences_stopped": {
            "description": "The sequences it stopped the contact in for good, still stopped for it.",
            "title": "Sequences Stopped",
            "type": "integer"
          }
        },
        "required": [
          "message_id",
          "blocked",
          "sequences_stopped"
        ],
        "title": "ThreadStopRequestSchema",
        "type": "object"
      },
      "ThreadUpdateSchema": {
        "description": "The marks of a conversation to change; a mark left out stays as it is.\n\nA reminder takes a done mark off, and a done mark cancels a reminder, so asking for both\nmarks done and a reminder is refused.",
        "properties": {
          "done": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "True marks it done now; false clears the mark.",
            "title": "Done"
          },
          "read": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {}
            ],
            "description": "True takes it out of the triage queue; false puts it back as unread.",
            "title": "Read"
          },
          "snoozed_until": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {},
              {
                "type": "null"
              }
            ],
            "description": "When it returns to the working views. Null cancels any reminder it is under.",
            "title": "Snoozed Until"
          }
        },
        "title": "ThreadUpdateSchema",
        "type": "object"
      },
      "ThumbsDownCreateSchema": {
        "description": "A thumbs down: what was wrong with something an agent wrote.",
        "properties": {
          "reason": {
            "description": "What is wrong, in the person's words. Required.",
            "maxLength": 1000,
            "title": "Reason",
            "type": "string"
          },
          "request_id": {
            "description": "The client's key for this thumbs down: sent again (a double click, a retry), it answers what the first one did and writes nothing.",
            "format": "uuid",
            "title": "Request Id",
            "type": "string"
          },
          "subject": {
            "description": "What it was given on. A `hand_edit` is a further note on the learning proposed from an edit (`POST /agent-learnings/hand-edits/`): it sharpens that learning and writes nothing again.",
            "discriminator": {
              "mapping": {
                "agent_preview": "#/components/schemas/AgentPreviewSubjectSchema",
                "hand_edit": "#/components/schemas/HandEditSubjectSchema",
                "reply_draft": "#/components/schemas/ReplyDraftSubjectSchema",
                "sent_message": "#/components/schemas/SentMessageSubjectSchema",
                "table_cells": "#/components/schemas/TableCellsSubjectSchema",
                "task": "#/components/schemas/TaskSubjectSchema",
                "writing_preview": "#/components/schemas/WritingPreviewSubjectSchema"
              },
              "propertyName": "kind"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/TableCellsSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/AgentPreviewSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/TaskSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/WritingPreviewSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/ReplyDraftSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/SentMessageSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/HandEditSubjectSchema"
              }
            ],
            "title": "Subject"
          }
        },
        "required": [
          "reason",
          "request_id",
          "subject"
        ],
        "title": "ThumbsDownCreateSchema",
        "type": "object"
      },
      "ThumbsDownEventReadSchema": {
        "description": "One thumbs down, as the note in place shows it.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/LearningAction"
          },
          "agent_name": {
            "title": "Agent Name",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "earlier_words": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/StepWordsReadSchema"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a Preview contact's thread: each message as it read before this Needs work rewrote it, so the new words can be shown against them. Null on every other surface, and once the earlier words are no longer kept.",
            "title": "Earlier Words"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "more": {
            "description": "A table agent's other learnings it wrote, one for each other point the reason made, in order; empty when it made one. Always empty on an outbound message, whose changes `proposal.changes` lists. Undo takes them all back.",
            "items": {
              "$ref": "#/components/schemas/LearnedPartReadSchema"
            },
            "title": "More",
            "type": "array"
          },
          "notes": {
            "description": "What the person said, oldest first, each note whole: the thumbs down's own, then each later note after it. Empty once its feedback session closed (saved, discarded or undone): the notes go with the session.",
            "items": {
              "type": "string"
            },
            "title": "Notes",
            "type": "array"
          },
          "proposal": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposalReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning an outbound thumbs down proposed; null for a table agent's."
          },
          "record_ids": {
            "description": "The rows a thumbs down on cells covered, so the grid shows its note on each; empty on every other surface.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Record Ids",
            "type": "array"
          },
          "redo_detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Redo Detail"
          },
          "redo_state": {
            "$ref": "#/components/schemas/RedoState"
          },
          "restore": {
            "$ref": "#/components/schemas/RestoreState",
            "description": "Where putting the original output back stands after Undo: `none`, `waiting`, `restored` or `left`."
          },
          "restore_detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the original was left as the redo left it.",
            "title": "Restore Detail"
          },
          "rev": {
            "default": 0,
            "description": "The revision of its changes: send it back when changing one, so a change made against an older set is refused.",
            "title": "Rev",
            "type": "integer"
          },
          "saved_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The saved agent the thumbs down was given to (for an outbound one, its sequence's writer); null for an unlinked column's.",
            "title": "Saved Agent Id"
          },
          "status": {
            "$ref": "#/components/schemas/LearningEventStatus",
            "description": "`applied` (its learning is saved), `undone` after Undo, `proposed` while its feedback session (on a sequence's message, a table's cells or a Preview example) waits for a person, `dismissed` once that one was thrown away (Undo, a rejection, a discard, or a week unsaved)."
          },
          "subject_key": {
            "description": "What it was given on, as `subject_key` names it: a read of several subjects at once sorts its thumbs downs back to each by this.",
            "title": "Subject Key",
            "type": "string"
          },
          "surface": {
            "$ref": "#/components/schemas/LearningSource",
            "description": "Where it was given. `hand_edit` is a learning a person's own edit proposed (`POST /agent-learnings/hand-edits/`): its card dismisses it (revert) and keeps the edit, and nothing is written again."
          },
          "text_after": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning as the thumbs down wrote it.",
            "title": "Text After"
          },
          "text_before": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What an updated learning said before.",
            "title": "Text Before"
          },
          "thread": {
            "description": "While its session waits (`proposed`): each note, oldest first, with who gave it, the AI's reply and the words it was given on. Empty once the session closed: a session lasts as long as its item waits for a decision.",
            "items": {
              "$ref": "#/components/schemas/SessionNoteReadSchema"
            },
            "title": "Thread",
            "type": "array"
          },
          "would_have_written": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WouldHaveWrittenReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "On a sent message: what the agent would have sent instead, once written (`redo_state` `written`); null before then and on every other surface."
          }
        },
        "required": [
          "id",
          "subject_key",
          "action",
          "text_after",
          "text_before",
          "status",
          "surface",
          "restore",
          "restore_detail",
          "redo_state",
          "redo_detail",
          "created_at",
          "agent_name"
        ],
        "title": "ThumbsDownEventReadSchema",
        "type": "object"
      },
      "ThumbsDownReadSchema": {
        "description": "What a thumbs down did.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/LearningAction",
            "description": "`added` a learning, or `updated` one about the same thing."
          },
          "agent_name": {
            "description": "The agent that learned it.",
            "title": "Agent Name",
            "type": "string"
          },
          "event_id": {
            "description": "The thumbs down, for Undo.",
            "format": "uuid",
            "title": "Event Id",
            "type": "string"
          },
          "learning": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentLearningReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The learning as written; null on a replay whose learning was deleted since."
          },
          "more": {
            "description": "A table agent's other learnings it wrote, one for each other point the reason made, in order; empty when it made one. Always empty on an outbound message, whose changes `proposal.changes` lists. Undo takes them all back.",
            "items": {
              "$ref": "#/components/schemas/LearnedPartReadSchema"
            },
            "title": "More",
            "type": "array"
          },
          "previous_text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the updated learning said before; null for an added one.",
            "title": "Previous Text"
          },
          "proposal": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProposalReadSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "The feedback session it opened or refined: the changes it proposes, not saved yet; `learning` is null then. A further thumbs down on the same message, cells or Preview example refines it (the latest note wins). Null on a replay of a session saved or thrown away since."
          },
          "redo": {
            "$ref": "#/components/schemas/RedoReadSchema"
          },
          "subject_key": {
            "description": "What the thumbs down was given on, as `list_thumbs_downs` takes it, so a screen that gave it elsewhere (the AI Assistant's card) can follow its note.",
            "title": "Subject Key",
            "type": "string"
          },
          "surface": {
            "$ref": "#/components/schemas/LearningSource",
            "description": "Where it was given; `hand_edit` for a learning a person's own edit proposed, whose card dismisses it and keeps the edit."
          }
        },
        "required": [
          "event_id",
          "action",
          "learning",
          "previous_text",
          "agent_name",
          "redo",
          "subject_key",
          "surface"
        ],
        "title": "ThumbsDownReadSchema",
        "type": "object"
      },
      "ThumbsDownRequestCreateSchema": {
        "description": "Needs work, a first or a further note on a feedback session, given in the background.",
        "properties": {
          "kind": {
            "const": "thumbs_down",
            "description": "A thumbs down, as `POST /agent-learnings/thumbs-downs/` takes it.",
            "title": "Kind",
            "type": "string"
          },
          "reason": {
            "description": "What is wrong, in the person's words. Required.",
            "maxLength": 1000,
            "title": "Reason",
            "type": "string"
          },
          "request_id": {
            "description": "The client's key for this thumbs down: sent again (a double click, a retry), it answers what the first one did and writes nothing.",
            "format": "uuid",
            "title": "Request Id",
            "type": "string"
          },
          "subject": {
            "description": "What it was given on. A `hand_edit` is a further note on the learning proposed from an edit (`POST /agent-learnings/hand-edits/`): it sharpens that learning and writes nothing again.",
            "discriminator": {
              "mapping": {
                "agent_preview": "#/components/schemas/AgentPreviewSubjectSchema",
                "hand_edit": "#/components/schemas/HandEditSubjectSchema",
                "reply_draft": "#/components/schemas/ReplyDraftSubjectSchema",
                "sent_message": "#/components/schemas/SentMessageSubjectSchema",
                "table_cells": "#/components/schemas/TableCellsSubjectSchema",
                "task": "#/components/schemas/TaskSubjectSchema",
                "writing_preview": "#/components/schemas/WritingPreviewSubjectSchema"
              },
              "propertyName": "kind"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/TableCellsSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/AgentPreviewSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/TaskSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/WritingPreviewSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/ReplyDraftSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/SentMessageSubjectSchema"
              },
              {
                "$ref": "#/components/schemas/HandEditSubjectSchema"
              }
            ],
            "title": "Subject"
          }
        },
        "required": [
          "reason",
          "request_id",
          "subject",
          "kind"
        ],
        "title": "ThumbsDownRequestCreateSchema",
        "type": "object"
      },
      "TimezoneSource": {
        "description": "Where a sender's timezone came from, which decides what may replace it.\n\n``GUESSED``: from whoever created the sender, or from the sequences it\nalready sent for. ``BROWSER``: reported by the browser driving the\nsender's LinkedIn, which fills a sender that had none. ``PERSON``: chosen\non the Senders page or through the AI Assistant. Since 2026-10-09 nothing\ndetected moves a zone a sender has, whatever its source: only a person\ndoes, and a zone a person clears is filled again by detection.",
        "enum": [
          "guessed",
          "browser",
          "person"
        ],
        "title": "TimezoneSource",
        "type": "string"
      },
      "ToolReadSchema": {
        "description": "One tool the AI Assistant can use, as the settings page and the trail name it.\n\nOne list, two readers. The settings page groups the writes into switches a\nworkspace can allow without asking. The chat's trail turns a step into a\nsentence a person can read: before this, a step showed the raw operation\nname and a turn's work read \"get ai context, find tools, list tables\".",
        "properties": {
          "action_label": {
            "description": "The action it takes, verb first: \"Add a column\". What the settings page names a permission by, and the words its approval card is titled with.",
            "title": "Action Label",
            "type": "string"
          },
          "area": {
            "description": "The part of the product it belongs to, for grouping.",
            "title": "Area",
            "type": "string"
          },
          "conditional_write": {
            "default": false,
            "description": "Whether it is not declared a write, yet some calls to it change the workspace: a buying-signal search adds rows only once it names a table. Such a call asks first unless this operation itself is allowed: a permission of its own, which no `family:<area>` grant covers. The settings page lists it with a switch of its own.",
            "title": "Conditional Write",
            "type": "boolean"
          },
          "description": {
            "description": "What it does, in full.",
            "title": "Description",
            "type": "string"
          },
          "destructive": {
            "default": false,
            "description": "Whether calling it removes something. Always asks a person, whatever is granted, and its card is drawn and read differently.",
            "title": "Destructive",
            "type": "boolean"
          },
          "grantable": {
            "description": "Whether a workspace may allow this to run without asking. False for the ones that may never be granted, which the settings page must not offer as a switch.",
            "title": "Grantable",
            "type": "boolean"
          },
          "label": {
            "description": "What it did, past tense: \"Searched for people\".",
            "title": "Label",
            "type": "string"
          },
          "name": {
            "description": "The tool's name, and the grant's key.",
            "title": "Name",
            "type": "string"
          },
          "parent": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For an extended tool, the built-in through which the assistant finds it, usually its family's listing tool. None for a built-in.",
            "title": "Parent"
          },
          "running_label": {
            "description": "What it is doing, while it does it: \"Searching for people\".",
            "title": "Running Label",
            "type": "string"
          },
          "tier": {
            "$ref": "#/components/schemas/ToolTier",
            "default": "builtin",
            "description": "Whether the assistant is offered this on every call (built-in) or only once a conversation has looked it up by name (extended). A budget, not a permission: an extended tool runs and is granted exactly like a built-in one."
          },
          "write": {
            "description": "Whether calling it changes the workspace.",
            "title": "Write",
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "label",
          "running_label",
          "action_label",
          "description",
          "area",
          "write",
          "grantable"
        ],
        "title": "ToolReadSchema",
        "type": "object"
      },
      "ToolTier": {
        "enum": [
          "builtin",
          "extended"
        ],
        "type": "string"
      },
      "TrainingFeedbackUpdateSchema": {
        "description": "One example's Looks good, or its withdrawal.",
        "properties": {
          "verdict": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TrainingVerdict"
              },
              {
                "type": "null"
              }
            ],
            "description": "`good` marks the example Looks good; null withdraws it. `bad` is refused: Needs work is a thumbs down with a reason, which runs the example again."
          }
        },
        "title": "TrainingFeedbackUpdateSchema",
        "type": "object"
      },
      "TrainingManualSourceSchema": {
        "description": "Preview examples typed by hand, one dict of input values per example.",
        "properties": {
          "kind": {
            "const": "manual",
            "default": "manual",
            "title": "Kind",
            "type": "string"
          },
          "rows": {
            "description": "One set of input values per example, in display order.",
            "items": {
              "additionalProperties": {
                "maxLength": 8000,
                "type": "string"
              },
              "propertyNames": {
                "maxLength": 100,
                "minLength": 1
              },
              "type": "object"
            },
            "maxItems": 25,
            "minItems": 1,
            "title": "Rows",
            "type": "array"
          }
        },
        "required": [
          "rows"
        ],
        "title": "TrainingManualSourceSchema",
        "type": "object"
      },
      "TrainingProgressSchema": {
        "description": "How far the examples' run has got.",
        "properties": {
          "done": {
            "title": "Done",
            "type": "integer"
          },
          "failed": {
            "title": "Failed",
            "type": "integer"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "total",
          "done",
          "failed"
        ],
        "title": "TrainingProgressSchema",
        "type": "object"
      },
      "TrainingRowReadSchema": {
        "description": "One example: its fixed inputs and its latest answer.\n\n``verdict`` is the reviewer's Looks good on that answer, null until given, which is\nwhat lets a reloaded page show the examples already judged. A Needs work runs the\nexample again in place: ``status`` goes back to pending, then running, and\n``run_no`` counts up.",
        "properties": {
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgentConfidence"
              },
              {
                "type": "null"
              }
            ]
          },
          "credits_charged": {
            "title": "Credits Charged",
            "type": "number"
          },
          "cycle": {
            "title": "Cycle",
            "type": "integer"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "error_class": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentErrorClass"
              },
              {
                "type": "null"
              }
            ]
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "inputs": {
            "additionalProperties": {
              "type": "string"
            },
            "title": "Inputs",
            "type": "object"
          },
          "needs_work": {
            "default": false,
            "description": "Whether the example is marked Needs work: its latest thumbs down stands. An Undo clears it, so an example put back as it was is not counted.",
            "title": "Needs Work",
            "type": "boolean"
          },
          "outcome": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EnrichmentCellOutcome"
              },
              {
                "type": "null"
              }
            ]
          },
          "position": {
            "title": "Position",
            "type": "integer"
          },
          "reasoning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reasoning"
          },
          "run_no": {
            "description": "How many times Needs work has run this example again; 0 for its first run.",
            "title": "Run No",
            "type": "integer"
          },
          "skipped_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Skipped Reason"
          },
          "sources": {
            "items": {
              "type": "string"
            },
            "title": "Sources",
            "type": "array"
          },
          "status": {
            "$ref": "#/components/schemas/TrainingRowStatus"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/TrainingStepSchema"
            },
            "title": "Steps",
            "type": "array"
          },
          "value": {
            "description": "The produced value, on success.",
            "title": "Value"
          },
          "verdict": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TrainingVerdict"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "position",
          "inputs",
          "cycle",
          "run_no",
          "status",
          "outcome",
          "error",
          "error_class",
          "skipped_reason",
          "confidence",
          "reasoning",
          "steps",
          "sources",
          "credits_charged",
          "verdict"
        ],
        "title": "TrainingRowReadSchema",
        "type": "object"
      },
      "TrainingRowStatus": {
        "description": "How far one training row has got in the CURRENT cycle's run.\n\n``DONE`` means the run settled, not that it succeeded. A row whose agent\ncall failed is still done, and its ``outcome`` says what happened. The\nreviewer critiques failures too.",
        "enum": [
          "pending",
          "running",
          "done"
        ],
        "title": "TrainingRowStatus",
        "type": "string"
      },
      "TrainingSessionCreateSchema": {
        "description": "The agent to preview and where a new Preview takes its examples from.",
        "properties": {
          "saved_agent_id": {
            "description": "The library agent to preview.",
            "format": "uuid",
            "title": "Saved Agent Id",
            "type": "string"
          },
          "source": {
            "discriminator": {
              "mapping": {
                "manual": "#/components/schemas/TrainingManualSourceSchema",
                "table": "#/components/schemas/TrainingTableSourceSchema"
              },
              "propertyName": "kind"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/TrainingTableSourceSchema"
              },
              {
                "$ref": "#/components/schemas/TrainingManualSourceSchema"
              }
            ],
            "title": "Source"
          }
        },
        "required": [
          "saved_agent_id",
          "source"
        ],
        "title": "TrainingSessionCreateSchema",
        "type": "object"
      },
      "TrainingSessionReadSchema": {
        "description": "A whole Preview, as the reviewer's page polls it.\n\nEverything the page needs in one payload: the phase (``status``), and the examples\nwith their answers and verdicts. The page keeps polling while any example runs,\na Needs work redo included.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "cycle": {
            "title": "Cycle",
            "type": "integer"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "progress": {
            "$ref": "#/components/schemas/TrainingProgressSchema"
          },
          "rows": {
            "items": {
              "$ref": "#/components/schemas/TrainingRowReadSchema"
            },
            "title": "Rows",
            "type": "array"
          },
          "saved_agent_id": {
            "format": "uuid",
            "title": "Saved Agent Id",
            "type": "string"
          },
          "source_input_mappings": {
            "additionalProperties": {
              "type": "string"
            },
            "title": "Source Input Mappings",
            "type": "object"
          },
          "source_kind": {
            "$ref": "#/components/schemas/TrainingSourceKind"
          },
          "source_table_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Table Id"
          },
          "status": {
            "$ref": "#/components/schemas/TrainingSessionStatus"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "saved_agent_id",
          "status",
          "cycle",
          "source_kind",
          "source_table_id",
          "source_input_mappings",
          "error",
          "created_at",
          "updated_at",
          "progress",
          "rows"
        ],
        "title": "TrainingSessionReadSchema",
        "type": "object"
      },
      "TrainingSessionStatus": {
        "description": "Where an agent Preview stands: the state the reviewer's screen shows.\n\nOne enum rather than a separate lifecycle flag and phase, because the\nphase IS the state: a session is either waiting on the machine\n(``RUNNING``), waiting on the reviewer (``REVIEWING``), or finished.\nCallers never derive the screen from row counts. A Needs work on one\nexample runs that example again without leaving ``REVIEWING``: the row's\nown status says it is running.",
        "enum": [
          "running",
          "reviewing",
          "proposed",
          "completed",
          "abandoned"
        ],
        "title": "TrainingSessionStatus",
        "type": "string"
      },
      "TrainingSessionStatusFilter": {
        "description": "A status a list of Previews can be narrowed to, or ``live`` for the open one.",
        "enum": [
          "live",
          "running",
          "reviewing",
          "completed",
          "abandoned"
        ],
        "title": "TrainingSessionStatusFilter",
        "type": "string"
      },
      "TrainingSourceKind": {
        "description": "Where a session's training inputs came from.",
        "enum": [
          "table",
          "manual"
        ],
        "title": "TrainingSourceKind",
        "type": "string"
      },
      "TrainingStepSchema": {
        "description": "One research step the agent took on an example.",
        "properties": {
          "action": {
            "$ref": "#/components/schemas/AgentStepAction"
          },
          "detail": {
            "title": "Detail",
            "type": "string"
          },
          "duration_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How long the step took; null on records that predate timing.",
            "title": "Duration Ms"
          },
          "observation": {
            "title": "Observation",
            "type": "string"
          },
          "outcome": {
            "$ref": "#/components/schemas/AgentStepOutcome",
            "default": "completed",
            "description": "How the step ended, so a failed or refused step reads as one."
          },
          "thought": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The model's stated reasoning for this step; null when not recorded.",
            "title": "Thought"
          }
        },
        "required": [
          "action",
          "detail",
          "observation"
        ],
        "title": "TrainingStepSchema",
        "type": "object"
      },
      "TrainingTablePreviewRequestSchema": {
        "description": "The table binding to show real rows for, before a Preview opens.",
        "properties": {
          "input_mappings": {
            "additionalProperties": {
              "format": "uuid",
              "type": "string"
            },
            "description": "Agent input name -> the column its value is read from.",
            "maxProperties": 20,
            "propertyNames": {
              "maxLength": 100,
              "minLength": 1
            },
            "title": "Input Mappings",
            "type": "object"
          },
          "row_count": {
            "default": 3,
            "description": "How many rows to show.",
            "maximum": 25.0,
            "minimum": 1.0,
            "title": "Row Count",
            "type": "integer"
          },
          "saved_agent_id": {
            "description": "The library agent the rows would preview.",
            "format": "uuid",
            "title": "Saved Agent Id",
            "type": "string"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "saved_agent_id",
          "table_id",
          "input_mappings"
        ],
        "title": "TrainingTablePreviewRequestSchema",
        "type": "object"
      },
      "TrainingTablePreviewResponseSchema": {
        "description": "The first rows a table source would feed the agent.",
        "properties": {
          "empty_inputs": {
            "description": "Inputs whose mapped column is blank in every previewed row. The agent would run without them, which is the expensive mistake this preview exists to make visible.",
            "items": {
              "type": "string"
            },
            "title": "Empty Inputs",
            "type": "array"
          },
          "rows": {
            "description": "One set of input values per row, in table order.",
            "items": {
              "additionalProperties": {
                "maxLength": 8000,
                "type": "string"
              },
              "propertyNames": {
                "maxLength": 100,
                "minLength": 1
              },
              "type": "object"
            },
            "title": "Rows",
            "type": "array"
          }
        },
        "required": [
          "rows",
          "empty_inputs"
        ],
        "title": "TrainingTablePreviewResponseSchema",
        "type": "object"
      },
      "TrainingTableSourceSchema": {
        "description": "Preview examples read from a table, one per row.",
        "properties": {
          "input_mappings": {
            "additionalProperties": {
              "format": "uuid",
              "type": "string"
            },
            "description": "Agent input name -> the column its value is read from.",
            "maxProperties": 20,
            "propertyNames": {
              "maxLength": 100,
              "minLength": 1
            },
            "title": "Input Mappings",
            "type": "object"
          },
          "kind": {
            "const": "table",
            "default": "table",
            "title": "Kind",
            "type": "string"
          },
          "row_count": {
            "default": 10,
            "description": "How many of the table's rows to preview.",
            "maximum": 25.0,
            "minimum": 1.0,
            "title": "Row Count",
            "type": "integer"
          },
          "table_id": {
            "format": "uuid",
            "title": "Table Id",
            "type": "string"
          }
        },
        "required": [
          "table_id",
          "input_mappings"
        ],
        "title": "TrainingTableSourceSchema",
        "type": "object"
      },
      "TrainingVerdict": {
        "description": "The reviewer's call on one row's output.\n\nKept as its own enum rather than reusing the cells' ``up``/``down`` thumbs:\na training verdict is a judgement on a worked example, and the two domains\nare deliberately independent of each other.\n\nOnly ``GOOD`` (Looks good) is given now. Needs work is a thumbs down\n(``agent_feedback``): it saves a learning and runs the example again, and\nthe learning event is its record. ``BAD`` stays for the verdicts given\nbefore, each with the note that explained it.",
        "enum": [
          "good",
          "bad"
        ],
        "title": "TrainingVerdict",
        "type": "string"
      },
      "UnauthorizedResponse": {
        "properties": {
          "detail": {
            "description": "The detail of why the request is unauthorized.",
            "title": "Detail",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "title": "UnauthorizedResponse",
        "type": "object"
      },
      "UnmatchedCompanySchema": {
        "description": "One company of the column that no one in the people search works at.",
        "properties": {
          "company": {
            "description": "The company as the column holds it: its website or page.",
            "title": "Company",
            "type": "string"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The company's name from the same row, read from the table's column of company names when it has one; null otherwise.",
            "title": "Name"
          },
          "suggestion": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CompanyNameSuggestionSchema"
              },
              {
                "type": "null"
              }
            ],
            "description": "A company of the same name the people search has people at: a sign the column holds another website than the one people list. Null when there is none, or the name is shared by too many companies."
          }
        },
        "required": [
          "company",
          "name",
          "suggestion"
        ],
        "title": "UnmatchedCompanySchema",
        "type": "object"
      },
      "UnprocessableEntityIssue": {
        "properties": {
          "input": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "items": {},
                "type": "array"
              },
              {
                "additionalProperties": true,
                "type": "object"
              }
            ],
            "description": "The user's input that caused the error.",
            "title": "Input"
          },
          "loc": {
            "description": "The location of the error. Always contains 1 or 2 elements. The first element is the type of location (e.g. 'body', 'query', 'path', 'header'). The second element is the name of the field that caused the error. If the error is not related to a specific field, the second element is not present.",
            "items": {
              "type": "string"
            },
            "title": "Loc",
            "type": "array"
          },
          "msg": {
            "description": "The message of the error. The error message to show to the user.",
            "title": "Msg",
            "type": "string"
          },
          "type": {
            "description": "The type of the error. Useful for frontend code to handle different types of errors.",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "loc",
          "msg",
          "type",
          "input"
        ],
        "title": "UnprocessableEntityIssue",
        "type": "object"
      },
      "UnprocessableEntityResponse": {
        "properties": {
          "detail": {
            "description": "The detail of the error. This is the error message to show to the user. You should also use the issues field to show more detailed error messages per field. Use this field for a single liner error message.",
            "title": "Detail",
            "type": "string"
          },
          "issues": {
            "description": "The issues that caused the error. There can be multiple issues. Each issue is a user-facing error message.",
            "items": {
              "$ref": "#/components/schemas/UnprocessableEntityIssue"
            },
            "title": "Issues",
            "type": "array"
          }
        },
        "required": [
          "detail",
          "issues"
        ],
        "title": "UnprocessableEntityResponse",
        "type": "object"
      },
      "UnreachableReason": {
        "description": "Which address a contact lacks for the channels their sequence uses.\n\nDerived at read time from the contact's row and the graph, never stored.\nNamed by channel rather than as one \"missing contact details\", because the\nfix is different: an email-only cadence needs an address, a LinkedIn-only\none a profile URL.",
        "enum": [
          "no_email",
          "no_linkedin_url",
          "no_email_or_linkedin_url"
        ],
        "title": "UnreachableReason",
        "type": "string"
      },
      "UnrecognisedEnrichmentContextSchema": {
        "description": "A context this build cannot parse.\n\nRead-side only: nothing ever writes it. The trail is append-only and\nkept forever, so it will always outlive the code that wrote it: a row\nfrom a newer deploy during a rollout, or one whose model later grew a\nfield without a default, would otherwise raise and take the whole page\nwith it. A feed that says \"something happened here\" beats a feed that\n500s.",
        "properties": {
          "recorded_type": {
            "default": "",
            "title": "Recorded Type",
            "type": "string"
          },
          "type": {
            "const": "unrecognised",
            "default": "unrecognised",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "UnrecognisedEnrichmentContextSchema",
        "type": "object"
      },
      "UnrecognisedSequenceContextSchema": {
        "description": "A context this build cannot parse. Read-side only; nothing writes it.",
        "properties": {
          "recorded_type": {
            "default": "",
            "title": "Recorded Type",
            "type": "string"
          },
          "type": {
            "const": "unrecognised",
            "default": "unrecognised",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "UnrecognisedSequenceContextSchema",
        "type": "object"
      },
      "UpcomingSkipReadSchema": {
        "description": "The step the contact waits on, which will be skipped when they reach it.",
        "properties": {
          "note": {
            "description": "Why, as one plain sentence.",
            "title": "Note",
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/StepSkipReason",
            "description": "Why: no_email or email_verdict on an email step, no_linkedin_url on a LinkedIn step. note says it as a sentence."
          },
          "step_id": {
            "format": "uuid",
            "title": "Step Id",
            "type": "string"
          },
          "verdict": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EmailDeliverability"
              },
              {
                "type": "null"
              }
            ],
            "description": "The address's deliverability verdict on an email_verdict skip."
          }
        },
        "required": [
          "step_id",
          "reason",
          "note"
        ],
        "title": "UpcomingSkipReadSchema",
        "type": "object"
      },
      "UpdateTableScheduleRequestSchema": {
        "description": "Change a table's cadence. Every field is optional.",
        "properties": {
          "delete_missing_rows": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Delete Missing Rows"
          },
          "frequency": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableScheduleFrequency"
              },
              {
                "type": "null"
              }
            ]
          },
          "hour": {
            "anyOf": [
              {
                "maximum": 23.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Hour"
          },
          "interval_unit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TableScheduleIntervalUnit"
              },
              {
                "type": "null"
              }
            ]
          },
          "interval_value": {
            "anyOf": [
              {
                "exclusiveMinimum": 0.0,
                "maximum": 365.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Interval Value"
          },
          "minute": {
            "anyOf": [
              {
                "maximum": 59.0,
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Minute"
          },
          "paused": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Paused"
          },
          "time_zone": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Time Zone"
          }
        },
        "title": "UpdateTableScheduleRequestSchema",
        "type": "object"
      },
      "UpdateTableSourceRequestSchema": {
        "description": "What may change on an existing source. A field left out keeps its value.",
        "properties": {
          "identity_field": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The key to match rows on from now on, one the identity options list as available. Every imported row is re-keyed with it. Leave it out to keep the key.",
            "title": "Identity Field"
          },
          "row_limit": {
            "anyOf": [
              {
                "exclusiveMinimum": 0.0,
                "maximum": 2147483647.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "New row ceiling; null lifts it. Leave it out to keep the ceiling.",
            "title": "Row Limit"
          }
        },
        "title": "UpdateTableSourceRequestSchema",
        "type": "object"
      },
      "UseAIExample": {
        "description": "One few-shot example: a sample input and the response it should get.",
        "properties": {
          "input": {
            "maxLength": 2000,
            "minLength": 1,
            "title": "Input",
            "type": "string"
          },
          "output": {
            "maxLength": 2000,
            "minLength": 1,
            "title": "Output",
            "type": "string"
          }
        },
        "required": [
          "input",
          "output"
        ],
        "title": "UseAIExample",
        "type": "object"
      },
      "UseAISettings": {
        "description": "Settings for the Use AI action, in both of its modes.\n\nONE action covers both \"answer from what the table already knows\" and\n\"go and find out\", because from the author's seat they are the same\nrequest with a different reach, and splitting them made people pick the\nwrong one. ``web_research`` is that reach, and it is what selects the\nmode: off runs a single completion over the row, on runs the bounded\nresearch agent (search, map, scrape, cite).\n\nIt defaults OFF. The cheap mode is the common one, a web run costs\nseveral times more per row, and a toggle that silently spends is the\nwrong default even when research is the better answer.\n\n``context`` is \"Provide context for task\"; ``examples`` are the few-shot\npairs that show the model what a good response looks like. Both are\nhard-capped so a pathological configuration cannot blow up the request or\nthe cost.\n\n``use_row_context`` defaults ON, and a column stored before the field\nexisted decodes to that same default (deliberately), so an author who\nnever thought to reference a column still gets a model that can see the\nrow. Turning it off narrows the run back to what the prompt itself names.\n\n``context_column_ids`` narrows ``use_row_context`` from the whole row to\na chosen subset: None (the default, and what every column stored before\nthe field existed decodes to) keeps every column (\"Entire row\" in the\neditor) while a list holds exactly the columns the author picked. It\nmeans nothing while ``use_row_context`` is off.\n\nThe remaining fields only bite in web mode. They are held on this one\nmodel rather than a nested \"agent settings\" object so that flipping\n``web_research`` never migrates a stored payload: a column that has been\nboth ways keeps whatever research scope it was last given.",
        "properties": {
          "context": {
            "anyOf": [
              {
                "maxLength": 4000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Context"
          },
          "context_column_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "The columns folded in when use_row_context is on; None means every column (\"Entire row\"). Stored by identity so renames are safe, but deliberately NOT a dependency: a listed column that is later deleted simply stops appearing in the context rather than blocking the delete or joining the recompute graph.",
            "title": "Context Column Ids"
          },
          "examples": {
            "items": {
              "$ref": "#/components/schemas/UseAIExample"
            },
            "maxItems": 5,
            "title": "Examples",
            "type": "array"
          },
          "find_work_email": {
            "default": false,
            "description": "Whether the model may buy a work email from the product's data suppliers while it researches, paid from the run's research budget. Off by default. For a column linked to a saved agent, the agent's own switch decides and this one is ignored.",
            "title": "Find Work Email",
            "type": "boolean"
          },
          "kind": {
            "const": "use_ai",
            "default": "use_ai",
            "title": "Kind",
            "type": "string"
          },
          "read_linkedin_profile": {
            "default": false,
            "description": "Whether the model may read a LinkedIn profile through the product's data suppliers while it researches, paid from the run's research budget. Off by default; ignored on a column linked to a saved agent.",
            "title": "Read Linkedin Profile",
            "type": "boolean"
          },
          "saved_agent_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Web research only: an org-level saved agent whose settings (effort, context) replace this column's own.",
            "title": "Saved Agent Id"
          },
          "starting_url_column_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Web research only: a column whose per-row value seeds the research. Stored by identity, so renames are safe.",
            "title": "Starting Url Column Id"
          },
          "stay_on_domain": {
            "default": false,
            "description": "Web research only: confine every site-targeting tool to the starting URL's domain.",
            "title": "Stay On Domain",
            "type": "boolean"
          },
          "use_business_context": {
            "default": false,
            "description": "Whether the org's AI business context is folded into the run's standing context. Off by default and folded at run time: the org edits its context in one place and every column that opted in follows, with no stored copy to go stale.",
            "title": "Use Business Context",
            "type": "boolean"
          },
          "use_row_context": {
            "default": true,
            "description": "Whether the rest of this row's columns are folded in as context, on top of whatever the prompt itself references.",
            "title": "Use Row Context",
            "type": "boolean"
          },
          "web_research": {
            "default": false,
            "description": "Whether the model may research the web. On turns this column into a bounded research agent that searches, reads pages and cites its sources; off answers from the row and the model's own knowledge. Off by default: a web run costs several times more per row.",
            "title": "Web Research",
            "type": "boolean"
          }
        },
        "title": "UseAISettings",
        "type": "object"
      },
      "ValueDistribution": {
        "properties": {
          "distinct_count": {
            "title": "Distinct Count",
            "type": "integer"
          },
          "empty_count": {
            "title": "Empty Count",
            "type": "integer"
          },
          "other_count": {
            "title": "Other Count",
            "type": "integer"
          },
          "total_count": {
            "title": "Total Count",
            "type": "integer"
          },
          "values": {
            "items": {
              "$ref": "#/components/schemas/ValueFrequency"
            },
            "title": "Values",
            "type": "array"
          }
        },
        "required": [
          "total_count",
          "empty_count",
          "distinct_count",
          "values",
          "other_count"
        ],
        "title": "ValueDistribution",
        "type": "object"
      },
      "ValueDistributionSchema": {
        "description": "How a column's values are spread across every live row of a table.",
        "properties": {
          "distinct_count": {
            "description": "Distinct nonempty values.",
            "title": "Distinct Count",
            "type": "integer"
          },
          "empty_count": {
            "description": "Rows whose cell is null, missing or whitespace-only text.",
            "title": "Empty Count",
            "type": "integer"
          },
          "other_count": {
            "description": "Nonempty rows holding a value outside `values`.",
            "title": "Other Count",
            "type": "integer"
          },
          "total_count": {
            "description": "Every live row of the table.",
            "title": "Total Count",
            "type": "integer"
          },
          "values": {
            "description": "The 20 most common values, most common first.",
            "items": {
              "$ref": "#/components/schemas/ValueFrequencySchema"
            },
            "title": "Values",
            "type": "array"
          }
        },
        "required": [
          "total_count",
          "empty_count",
          "distinct_count",
          "values",
          "other_count"
        ],
        "title": "ValueDistributionSchema",
        "type": "object"
      },
      "ValueFrequency": {
        "properties": {
          "count": {
            "title": "Count",
            "type": "integer"
          },
          "percentage": {
            "title": "Percentage",
            "type": "number"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value",
          "count",
          "percentage"
        ],
        "title": "ValueFrequency",
        "type": "object"
      },
      "ValueFrequencySchema": {
        "description": "One nonempty value of a column and its share of all rows.",
        "properties": {
          "count": {
            "description": "Rows holding the value.",
            "title": "Count",
            "type": "integer"
          },
          "percentage": {
            "description": "The share of all rows holding it, empty rows included.",
            "title": "Percentage",
            "type": "number"
          },
          "value": {
            "description": "The value, as text.",
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value",
          "count",
          "percentage"
        ],
        "title": "ValueFrequencySchema",
        "type": "object"
      },
      "VerbReadSchema": {
        "description": "One of the eight verbs, as the settings pane and the agent editor list it.",
        "properties": {
          "always_proposes": {
            "description": "Whether the verb always waits for a person, whatever was granted.",
            "title": "Always Proposes",
            "type": "boolean"
          },
          "key": {
            "$ref": "#/components/schemas/WorkspaceVerb"
          },
          "label": {
            "title": "Label",
            "type": "string"
          }
        },
        "required": [
          "key",
          "label",
          "always_proposes"
        ],
        "title": "VerbReadSchema",
        "type": "object"
      },
      "WaitingOn": {
        "description": "What a live contact is held behind in the approval queue, read at list time.\n\nDerived from the contact's task for its current step, never stored: the\ntask is the truth, and a copy on the enrolment would lag behind it.",
        "enum": [
          "approval",
          "linkedin",
          "send"
        ],
        "title": "WaitingOn",
        "type": "string"
      },
      "WithdrawConnectionRequestOutcome": {
        "additionalProperties": false,
        "description": "What withdrawing an invitation produced: the common fields and the nine profile facts.\n\n``invitation_pending`` re-read after the click is the verification. The\nledger row settles on the params' urn, not on anything read here.",
        "properties": {
          "already_connected": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Connected"
          },
          "already_following": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Already Following"
          },
          "can_send_message": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Can Send Message"
          },
          "found_already": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInFoundAlready"
              },
              {
                "type": "null"
              }
            ]
          },
          "invitation_pending": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Invitation Pending"
          },
          "kind": {
            "const": "withdraw_connection_request",
            "default": "withdraw_connection_request",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Urn"
          },
          "member_urns": {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 8,
            "title": "Member Urns",
            "type": "array"
          },
          "open_profile": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Open Profile"
          },
          "page_loaded": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Page Loaded"
          },
          "profile_resolved": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Profile Resolved"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LinkedInSkipReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "vanity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanity"
          }
        },
        "title": "WithdrawConnectionRequestOutcome",
        "type": "object"
      },
      "WithdrawConnectionRequestParams": {
        "additionalProperties": false,
        "description": "Withdraw an invitation this sender already sent.\n\n``profile_url`` is where the browser goes first. ``member_urn`` is\nrequired, unlike everywhere else: the ledger row is keyed on it, the\ndispatcher read it off that row when it decided to withdraw, and\nsettlement closes the row by it.",
        "properties": {
          "kind": {
            "const": "withdraw_connection_request",
            "default": "withdraw_connection_request",
            "title": "Kind",
            "type": "string"
          },
          "member_urn": {
            "maxLength": 128,
            "title": "Member Urn",
            "type": "string"
          },
          "profile_url": {
            "maxLength": 512,
            "title": "Profile Url",
            "type": "string"
          }
        },
        "required": [
          "profile_url",
          "member_urn"
        ],
        "title": "WithdrawConnectionRequestParams",
        "type": "object"
      },
      "WorkspaceChatAttachmentKind": {
        "description": "What kind of thing a file the person attached is, for the card that shows it.\n\nEach kind is read by its own reader and drawn under its own icon: a CSV\nor an Excel file is a spreadsheet, rows under a header; a PDF is pages of\ntext, and the rows of the table its pages hold when one is asked for.",
        "enum": [
          "spreadsheet",
          "pdf"
        ],
        "title": "WorkspaceChatAttachmentKind",
        "type": "string"
      },
      "WorkspaceChatConversationReadSchema": {
        "description": "One conversation, as the history lists it.\n\n``title`` and ``pinned`` come from the thread list's overlay when the\nconversation was renamed or pinned there, so this history and the union\nlist on the Chat page name and order the same thread the same way.",
        "properties": {
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_message_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Message At"
          },
          "pinned": {
            "default": false,
            "description": "Pinned in the thread list. Pinned conversations are listed first.",
            "title": "Pinned",
            "type": "boolean"
          },
          "title": {
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "last_message_at",
          "created_at"
        ],
        "title": "WorkspaceChatConversationReadSchema",
        "type": "object"
      },
      "WorkspaceChatErrorReason": {
        "description": "Why a turn could not run, for a client choosing what to show instead.",
        "enum": [
          "limit",
          "paused",
          "not_found",
          "resumed"
        ],
        "title": "WorkspaceChatErrorReason",
        "type": "string"
      },
      "WorkspaceChatMessageCreateSchema": {
        "description": "Send the AI Assistant a message.",
        "properties": {
          "attachment_ids": {
            "description": "The files sent with this message, as the attachments route returned them when they were uploaded: CSV, Excel or PDF, each of them yours and not yet sent with another message. The assistant reads a spreadsheet's columns and rows and a PDF's pages. Optional.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 10,
            "title": "Attachment Ids",
            "type": "array"
          },
          "page": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PageContextSchema-Input"
              },
              {
                "type": "null"
              }
            ],
            "description": "What you have open, so the assistant can resolve 'this table' without you naming it. Optional."
          },
          "pasted": {
            "anyOf": [
              {
                "items": {
                  "maxLength": 200,
                  "type": "string"
                },
                "maxItems": 1000,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "A list you pasted rather than typed: domains, emails, names, one per entry. Sent as data instead of prose, so the assistant reads it as a list and the conversation shows it as a count rather than a wall of text. Optional.",
            "title": "Pasted"
          },
          "prompt": {
            "maxLength": 4000,
            "minLength": 1,
            "title": "Prompt",
            "type": "string"
          },
          "quote": {
            "anyOf": [
              {
                "maxLength": 2000,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Part of an earlier reply you selected, sent with your words so the assistant knows what they refer to. Kept with the message and shown above it in the conversation. Optional.",
            "title": "Quote"
          }
        },
        "required": [
          "prompt"
        ],
        "title": "WorkspaceChatMessageCreateSchema",
        "type": "object"
      },
      "WorkspaceChatMessageReadSchema": {
        "description": "One message in a conversation, with the action cards a reply raised.\n\nDeliberately leaves out why a failed turn failed and what it cost: the\nfirst can carry a supplier's own words, and the tokens, the dollars and\nthe model are the operator's, kept on the row for the costs page and\nnever returned here. The cards ride on the message so a transcript\nrenders them under the right reply without a second request.\n\n``duration_ms`` is the exception to that rule, and deliberately so: how\nlong an answer took is the customer's own time, and a reply that says it\ntook forty seconds reads as work rather than as a stall.",
        "properties": {
          "actions": {
            "description": "The actions this reply proposed or applied, in the order the AI Assistant named them, as they stand now. Empty for user messages and replies that acted on nothing.",
            "items": {
              "$ref": "#/components/schemas/ActionProposalReadSchema"
            },
            "title": "Actions",
            "type": "array"
          },
          "attachments": {
            "description": "The files sent with this message, in the order they were added, each as the card above the message draws it. Empty for a reply, and for a message sent with none.",
            "items": {
              "$ref": "#/components/schemas/ChatAttachmentReadSchema"
            },
            "title": "Attachments",
            "type": "array"
          },
          "content": {
            "title": "Content",
            "type": "string"
          },
          "conversation_id": {
            "format": "uuid",
            "title": "Conversation Id",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "duration_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "How long this turn took end to end, in milliseconds. Null for your own messages and for a reply saved before the clock existed.",
            "title": "Duration Ms"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "page": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PageContextSchema-Output"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the person was when they sent this message: the page, the thing open on it and the names it showed them then. Null for a reply, and for a message sent with no page."
          },
          "pasted_count": {
            "description": "How many entries the person pasted alongside these words. The list itself is not returned: the transcript shows \"128 domains\", not the domains. Zero when nothing was pasted.",
            "title": "Pasted Count",
            "type": "integer"
          },
          "pasted_kind": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PastedKind"
              },
              {
                "type": "null"
              }
            ],
            "description": "What the pasted list holds, so the transcript can say \"128 domains\" the way the composer did: `domains`, `emails`, `names`, or `entries` for a list of nothing in particular. Null when nothing was pasted."
          },
          "plan": {
            "description": "The task list the AI Assistant published before starting a job with several steps in it, in order. Empty when it did not publish one, which is every short answer.",
            "items": {
              "type": "string"
            },
            "title": "Plan",
            "type": "array"
          },
          "plan_done": {
            "description": "How many of the plan's steps the AI Assistant marked done, counted from the first: 2 means the first two are done. Zero when nothing was marked, and for a reply with no plan.",
            "title": "Plan Done",
            "type": "integer"
          },
          "question": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WorkspaceChatQuestion"
              },
              {
                "type": "null"
              }
            ],
            "description": "The one clarifying question this turn ended on, with whole answers to tap. Tapping one sends it as the next message. Null when the turn did not ask anything."
          },
          "quote": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The part of an earlier reply the person selected and asked about, as it stood when they took it, shown above their words. Null for a reply, and for a message that quoted nothing.",
            "title": "Quote"
          },
          "role": {
            "$ref": "#/components/schemas/WorkspaceChatRole"
          },
          "segments": {
            "description": "A reply that paused for approval, split where it paused: each part's text, then the cards that part raised, in order. Draw each part's text directly above its own cards. `content` still holds every part's text joined, and a `failed` reply's `content` is its failure sentence, which is in no part. Empty for a reply that never paused and for replies saved before parts were kept: draw `content`, then every card.",
            "items": {
              "$ref": "#/components/schemas/WorkspaceChatSegmentReadSchema"
            },
            "title": "Segments",
            "type": "array"
          },
          "sequence": {
            "title": "Sequence",
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/WorkspaceChatStatus"
          },
          "steps": {
            "description": "The trail this turn showed while it ran, as it was shown. Empty for user messages.",
            "items": {
              "$ref": "#/components/schemas/AiStep"
            },
            "title": "Steps",
            "type": "array"
          },
          "suggestion_kinds": {
            "description": "What each of `suggestions` is about, in the same order and as many, which picks the icon it wears: `business_context`, `email`, `phone`, `sequence`, `agent`, `table`, `search`, `inbox`, `mailbox` or `other`. Empty for a reply saved before kinds were kept.",
            "items": {
              "$ref": "#/components/schemas/NextStepKind"
            },
            "title": "Suggestion Kinds",
            "type": "array"
          },
          "suggestions": {
            "description": "Up to three follow-ups the AI Assistant offered, each written as a message you would send. Empty when it offered none.",
            "items": {
              "type": "string"
            },
            "title": "Suggestions",
            "type": "array"
          }
        },
        "required": [
          "id",
          "conversation_id",
          "sequence",
          "role",
          "status",
          "content",
          "steps",
          "actions",
          "pasted_count",
          "pasted_kind",
          "attachments",
          "quote",
          "page",
          "plan",
          "plan_done",
          "question",
          "suggestions",
          "suggestion_kinds",
          "duration_ms",
          "segments",
          "created_at"
        ],
        "title": "WorkspaceChatMessageReadSchema",
        "type": "object"
      },
      "WorkspaceChatQuestion": {
        "description": "One clarifying question a turn ended on, with the answers to tap.\n\n``options`` are whole replies, ready to send as the next message, never\nletters or numbers to pick from: tapping one is the same as typing it, so\na person who wants to say something else still can.",
        "properties": {
          "options": {
            "items": {
              "maxLength": 300,
              "type": "string"
            },
            "maxItems": 6,
            "title": "Options",
            "type": "array"
          },
          "text": {
            "maxLength": 500,
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "WorkspaceChatQuestion",
        "type": "object"
      },
      "WorkspaceChatRole": {
        "description": "Who wrote a message.",
        "enum": [
          "user",
          "assistant"
        ],
        "title": "WorkspaceChatRole",
        "type": "string"
      },
      "WorkspaceChatSegmentReadSchema": {
        "description": "One part of a reply that paused for approval: its words, then the cards they are about.\n\nA turn that pauses on a card and carries on once it is decided is one\nreply. Its parts are what each run of it said, each followed by the cards\nthat run raised, so a transcript draws the words about a card directly\nabove that card.",
        "properties": {
          "action_ids": {
            "description": "The ids of the cards this part raised, in order, to draw under its text. Each is one of the reply's `actions`; an id with no card there is a card gone since, and is skipped.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Action Ids",
            "type": "array"
          },
          "text": {
            "description": "What this part of the reply said, as markdown. Empty when the part only raised cards.",
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text",
          "action_ids"
        ],
        "title": "WorkspaceChatSegmentReadSchema",
        "type": "object"
      },
      "WorkspaceChatStatus": {
        "description": "Whether a turn finished.\n\nA reply is written PENDING in the same transaction as the person's\nmessage, before the model is called, and filled in as COMPLETE or FAILED\nonce the turn is saved. So a question is never on disk without a reply\nrow under it: a crashed turn is saved FAILED rather than dropped, and a\nturn whose process died between the two transactions is a reply still\npending, which the abandoned-turn sweep fails. Either way the user sees\na reply they can retry instead of a question with nothing under it.",
        "enum": [
          "pending",
          "waiting",
          "complete",
          "failed"
        ],
        "title": "WorkspaceChatStatus",
        "type": "string"
      },
      "WorkspaceChatStopResponseSchema": {
        "description": "A Stop was asked for. Whether it lands is the stream's to say.\n\nThe flag is cooperative and best effort: the turn reads it before its\nmodel call and while the model writes, and a turn that has already landed\nis not affected. The stream reports the outcome as a `result` whose reply\ncarries `failed` and reads `Stopped by you`. Echoes the turn the Stop was\naddressed to, as the `turn` frame named it.",
        "properties": {
          "conversation_id": {
            "format": "uuid",
            "title": "Conversation Id",
            "type": "string"
          },
          "user_message_sequence": {
            "title": "User Message Sequence",
            "type": "integer"
          }
        },
        "required": [
          "conversation_id",
          "user_message_sequence"
        ],
        "title": "WorkspaceChatStopResponseSchema",
        "type": "object"
      },
      "WorkspaceChatStreamErrorSchema": {
        "description": "The data of an SSE ``error`` frame, and the ``detail`` of a refused turn.\n\n``reason`` is set when the turn never ran: ``limit`` (the workspace's\nallowance is spent), ``paused`` (the AI Assistant is switched off),\n``not_found`` (the conversation is not the caller's) or ``resumed`` (a\nwaiting reply another run is already carrying on). It is null for\nanything else.",
        "properties": {
          "detail": {
            "title": "Detail",
            "type": "string"
          },
          "reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WorkspaceChatErrorReason"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "detail",
          "reason"
        ],
        "title": "WorkspaceChatStreamErrorSchema",
        "type": "object"
      },
      "WorkspaceChatTurnResponseSchema": {
        "description": "Both halves of one turn, as saved.\n\nThe user message too, not just the reply: the client drew its own copy\nbefore sending and reconciles it against this one.",
        "properties": {
          "assistant_message": {
            "$ref": "#/components/schemas/WorkspaceChatMessageReadSchema"
          },
          "user_message": {
            "$ref": "#/components/schemas/WorkspaceChatMessageReadSchema"
          }
        },
        "required": [
          "user_message",
          "assistant_message"
        ],
        "title": "WorkspaceChatTurnResponseSchema",
        "type": "object"
      },
      "WorkspaceChatUnavailableResponseSchema": {
        "description": "A refused turn: the sentence to show, and why.",
        "properties": {
          "detail": {
            "$ref": "#/components/schemas/WorkspaceChatStreamErrorSchema"
          }
        },
        "required": [
          "detail"
        ],
        "title": "WorkspaceChatUnavailableResponseSchema",
        "type": "object"
      },
      "WorkspaceVerb": {
        "description": "The eight things an AI may do to a workspace.\n\nExactly eight, not sixty: today's cell-level actions all run against one\ncell, and building a table, adding contacts to a sequence and starting a\nsearch had no home at all. Anything new here is a product decision about\nwhat an assistant may touch, not a convenience for a planner.",
        "enum": [
          "create_table_from_search",
          "add_column",
          "run_column",
          "enrich_rows",
          "add_contacts_to_sequence",
          "push_to_destination",
          "call_endpoint",
          "start_search"
        ],
        "title": "WorkspaceVerb",
        "type": "string"
      },
      "WouldHaveWrittenReadSchema": {
        "description": "What the agent would have sent in place of a sent message, with the proposed learning.",
        "properties": {
          "body": {
            "description": "The words.",
            "title": "Body",
            "type": "string"
          },
          "subject": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The subject line; null for LinkedIn.",
            "title": "Subject"
          }
        },
        "required": [
          "subject",
          "body"
        ],
        "title": "WouldHaveWrittenReadSchema",
        "type": "object"
      },
      "WriteCapabilitiesSchema": {
        "description": "What one destination record type can actually do, fully derived.",
        "properties": {
          "actions": {
            "description": "The write actions this record type supports, including composite upsert.",
            "items": {
              "$ref": "#/components/schemas/ExportWriteAction"
            },
            "title": "Actions",
            "type": "array"
          },
          "bulk_actions": {
            "description": "Action values with a synchronous bulk write method: the ones a batched export can actually use.",
            "items": {
              "type": "string"
            },
            "title": "Bulk Actions",
            "type": "array"
          },
          "can_match": {
            "description": "Whether an existing record can be found by field value: the precondition for replay-safe creates. False means only blind creates are possible and the editor must say so.",
            "title": "Can Match",
            "type": "boolean"
          },
          "identity_fields_by_action": {
            "additionalProperties": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "description": "Selectable match/identity fields per action value. An EMPTY list means the destination resolves identity dynamically (a database: any column), and the picker falls back to the discovered fields.",
            "title": "Identity Fields By Action",
            "type": "object"
          },
          "suggested_batch_size": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "The destination's own recommended batch size, or None.",
            "title": "Suggested Batch Size"
          },
          "supports_bulk": {
            "description": "Whether records can be written in batches.",
            "title": "Supports Bulk",
            "type": "boolean"
          },
          "update_modes": {
            "description": "Supported write modes (replace, patch, set_once) for update/upsert.",
            "items": {
              "type": "string"
            },
            "title": "Update Modes",
            "type": "array"
          }
        },
        "required": [
          "actions",
          "identity_fields_by_action",
          "update_modes",
          "supports_bulk",
          "bulk_actions",
          "suggested_batch_size",
          "can_match"
        ],
        "title": "WriteCapabilitiesSchema",
        "type": "object"
      },
      "WritingPreviewSubjectSchema": {
        "description": "One contact of a sequence's AI writing Preview.",
        "properties": {
          "kind": {
            "const": "writing_preview",
            "title": "Kind",
            "type": "string"
          },
          "record_id": {
            "format": "uuid",
            "title": "Record Id",
            "type": "string"
          },
          "sequence_id": {
            "format": "uuid",
            "title": "Sequence Id",
            "type": "string"
          },
          "step_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The step whose Preview the note is given on. The contact's session covers every step, so the learner reads the note as about this one; the note itself is kept as typed.",
            "title": "Step Id"
          }
        },
        "required": [
          "kind",
          "sequence_id",
          "record_id"
        ],
        "title": "WritingPreviewSubjectSchema",
        "type": "object"
      }
    },
    "securitySchemes": {
      "APIKeyHeader": {
        "in": "header",
        "name": "X-API-Key",
        "type": "apiKey"
      },
      "HTTPBearer": {
        "scheme": "bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "contact": {
      "email": "support@getoneprofile.ai",
      "name": "Oneprofile Support"
    },
    "description": "REST API reference for Oneprofile, the GTM data layer for your CRM. Manage tables, enrichments, and integrations. Authenticate with an API key to get started.",
    "termsOfService": "https://www.getoneprofile.ai/terms",
    "title": "API Reference | Oneprofile",
    "version": "0.0"
  },
  "openapi": "3.1.0",
  "paths": {
    "/accounts/": {
      "get": {
        "description": "List the workspace's accounts: one per company, gathered from every table whose rows name a company by its website, its LinkedIn page or a work address. By default only accounts where somebody was enrolled in a sequence or has a conversation; `activity=all` lists every one. Last touched first unless `order_by` says otherwise; accounts nobody was reached at come last, by `last_touch_at` or by `employee_count` either way. Building the accounts the first time can take a few minutes; `GET /accounts/length/` says while it does.",
        "operationId": "list_accounts",
        "parameters": [
          {
            "in": "query",
            "name": "activity",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/AccountActivityFilter",
              "default": "with_activity",
              "description": "Only accounts where somebody was reached (the default), or every account."
            },
            "description": "Only accounts where somebody was reached (the default), or every account."
          },
          {
            "in": "query",
            "name": "has_people",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only accounts with at least one person on a table (`true`), or with none (`false`); omit for both.",
              "title": "Has People"
            },
            "description": "Only accounts with at least one person on a table (`true`), or with none (`false`); omit for both."
          },
          {
            "in": "query",
            "name": "industry",
            "required": false,
            "schema": {
              "description": "Only accounts in these industries, as `GET /accounts/industries/` names them (case and spaces aside); repeat for several.",
              "items": {
                "maxLength": 255,
                "type": "string"
              },
              "maxItems": 100,
              "title": "Industry",
              "type": "array"
            },
            "description": "Only accounts in these industries, as `GET /accounts/industries/` names them (case and spaces aside); repeat for several."
          },
          {
            "in": "query",
            "name": "outreach",
            "required": false,
            "schema": {
              "description": "Only accounts where somebody replied, bounced or is in a sequence now; repeat the parameter for any of several. Omit for every account.",
              "items": {
                "$ref": "#/components/schemas/AccountOutreachKind"
              },
              "maxItems": 3,
              "title": "Outreach",
              "type": "array"
            },
            "description": "Only accounts where somebody replied, bounced or is in a sequence now; repeat the parameter for any of several. Omit for every account."
          },
          {
            "in": "query",
            "name": "owner",
            "required": false,
            "schema": {
              "description": "Only accounts whose CRM owner is one of these, as `GET /accounts/owners/` names them (case and spaces aside), or `none` for the accounts no CRM record gives an owner; repeat for several.",
              "items": {
                "maxLength": 255,
                "type": "string"
              },
              "maxItems": 100,
              "title": "Owner",
              "type": "array"
            },
            "description": "Only accounts whose CRM owner is one of these, as `GET /accounts/owners/` names them (case and spaces aside), or `none` for the accounts no CRM record gives an owner; repeat for several."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Text found in the account's name or domain, a person's name on it, another row's name for the company, or the website or LinkedIn page of an account merged into it. A row found by one of the last three says which in `search_match`. Those three are read for a search of 3 characters or more, and only with `search_rows`.",
              "title": "Search"
            },
            "description": "Text found in the account's name or domain, a person's name on it, another row's name for the company, or the website or LinkedIn page of an account merged into it. A row found by one of the last three says which in `search_match`. Those three are read for a search of 3 characters or more, and only with `search_rows`."
          },
          {
            "in": "query",
            "name": "search_rows",
            "required": false,
            "schema": {
              "default": true,
              "description": "Whether `search` also reads the accounts' rows (a person's name, another name, a merged account), not only each account's own name and domain. Default true.",
              "title": "Search Rows",
              "type": "boolean"
            },
            "description": "Whether `search` also reads the accounts' rows (a person's name, another name, a merged account), not only each account's own name and domain. Default true."
          },
          {
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "description": "Only accounts whose headcount falls in these bands (a range by its low end), or `unknown` for none; repeat for several.",
              "items": {
                "$ref": "#/components/schemas/AccountSizeBand"
              },
              "maxItems": 9,
              "title": "Size",
              "type": "array"
            },
            "description": "Only accounts whose headcount falls in these bands (a range by its low end), or `unknown` for none; repeat for several."
          },
          {
            "in": "query",
            "name": "table_id",
            "required": false,
            "schema": {
              "description": "Only accounts with a row on one of these tables; repeat for several.",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "title": "Table Id",
              "type": "array"
            },
            "description": "Only accounts with a row on one of these tables; repeat for several."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForLastTouchAtNameEmployeeCountPeopleCountNewestRowAt",
              "default": "last_touch_at",
              "enum": [
                "last_touch_at",
                "name",
                "employee_count",
                "people_count",
                "newest_row_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AccountReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List accounts",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/industries/": {
      "get": {
        "description": "List the industries the accounts hold, the most held first, with how many hold each: the values the list's `industry` filter takes. Spellings that differ only by case or spaces are one industry.",
        "operationId": "list_account_industries",
        "parameters": [
          {
            "in": "query",
            "name": "activity",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/AccountActivityFilter",
              "default": "with_activity",
              "description": "The industries of the accounts with outreach (the default), or of all."
            },
            "description": "The industries of the accounts with outreach (the default), or of all."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AccountIndustryReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List account industries",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/length/": {
      "get": {
        "description": "How many accounts the list's filters select, and whether they are still being built.",
        "operationId": "count_accounts",
        "parameters": [
          {
            "description": "Only accounts where somebody was reached (the default), or every account.",
            "in": "query",
            "name": "activity",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/AccountActivityFilter",
              "default": "with_activity",
              "description": "Only accounts where somebody was reached (the default), or every account."
            }
          },
          {
            "description": "Text found in the account's name or domain, a person's name on it, another row's name for the company, or the website or LinkedIn page of an account merged into it. A row found by one of the last three says which in `search_match`. Those three are read for a search of 3 characters or more, and only with `search_rows`.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Text found in the account's name or domain, a person's name on it, another row's name for the company, or the website or LinkedIn page of an account merged into it. A row found by one of the last three says which in `search_match`. Those three are read for a search of 3 characters or more, and only with `search_rows`.",
              "title": "Search"
            }
          },
          {
            "description": "Whether `search` also reads the accounts' rows (a person's name, another name, a merged account), not only each account's own name and domain. Default true.",
            "in": "query",
            "name": "search_rows",
            "required": false,
            "schema": {
              "default": true,
              "description": "Whether `search` also reads the accounts' rows (a person's name, another name, a merged account), not only each account's own name and domain. Default true.",
              "title": "Search Rows",
              "type": "boolean"
            }
          },
          {
            "description": "Only accounts with at least one person on a table (`true`), or with none (`false`); omit for both.",
            "in": "query",
            "name": "has_people",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only accounts with at least one person on a table (`true`), or with none (`false`); omit for both.",
              "title": "Has People"
            }
          },
          {
            "description": "Only accounts where somebody replied, bounced or is in a sequence now; repeat the parameter for any of several. Omit for every account.",
            "in": "query",
            "name": "outreach",
            "required": false,
            "schema": {
              "description": "Only accounts where somebody replied, bounced or is in a sequence now; repeat the parameter for any of several. Omit for every account.",
              "items": {
                "$ref": "#/components/schemas/AccountOutreachKind"
              },
              "maxItems": 3,
              "title": "Outreach",
              "type": "array"
            }
          },
          {
            "description": "Only accounts in these industries, as `GET /accounts/industries/` names them (case and spaces aside); repeat for several.",
            "in": "query",
            "name": "industry",
            "required": false,
            "schema": {
              "description": "Only accounts in these industries, as `GET /accounts/industries/` names them (case and spaces aside); repeat for several.",
              "items": {
                "maxLength": 255,
                "type": "string"
              },
              "maxItems": 100,
              "title": "Industry",
              "type": "array"
            }
          },
          {
            "description": "Only accounts whose headcount falls in these bands (a range by its low end), or `unknown` for none; repeat for several.",
            "in": "query",
            "name": "size",
            "required": false,
            "schema": {
              "description": "Only accounts whose headcount falls in these bands (a range by its low end), or `unknown` for none; repeat for several.",
              "items": {
                "$ref": "#/components/schemas/AccountSizeBand"
              },
              "maxItems": 9,
              "title": "Size",
              "type": "array"
            }
          },
          {
            "description": "Only accounts with a row on one of these tables; repeat for several.",
            "in": "query",
            "name": "table_id",
            "required": false,
            "schema": {
              "description": "Only accounts with a row on one of these tables; repeat for several.",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "title": "Table Id",
              "type": "array"
            }
          },
          {
            "description": "Only accounts whose CRM owner is one of these, as `GET /accounts/owners/` names them (case and spaces aside), or `none` for the accounts no CRM record gives an owner; repeat for several.",
            "in": "query",
            "name": "owner",
            "required": false,
            "schema": {
              "description": "Only accounts whose CRM owner is one of these, as `GET /accounts/owners/` names them (case and spaces aside), or `none` for the accounts no CRM record gives an owner; repeat for several.",
              "items": {
                "maxLength": 255,
                "type": "string"
              },
              "maxItems": 100,
              "title": "Owner",
              "type": "array"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count accounts",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/logos/{logo_name}/": {
      "get": {
        "description": "A company's logo, as an account's `logo_path` names it. Needs no credentials: an image tag cannot send them, and the random name is the only way to it.",
        "operationId": "get_account_logo",
        "parameters": [
          {
            "description": "The logo's name, as an account's `logo_path` gives it.",
            "in": "path",
            "name": "logo_name",
            "required": true,
            "schema": {
              "description": "The logo's name, as an account's `logo_path` gives it.",
              "maxLength": 37,
              "minLength": 1,
              "pattern": "^[0-9a-f]{32}\\.(?:png|jpg|gif|webp|ico)$",
              "title": "Logo Name",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {}
            },
            "description": "The logo."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "No logo by that name."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "summary": "Get a company logo",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/merges/": {
      "get": {
        "description": "List the merges people made: each account merged away, and the one it joined.",
        "operationId": "list_account_merges",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForFromKey",
              "default": "from_key",
              "enum": [
                "from_key"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AccountMergeReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List account merges",
        "tags": [
          "accounts"
        ]
      },
      "post": {
        "description": "Merge one account into another, for one company the tables spell two ways: every row of the first shows on the second, now and as rows are added, until the merge is undone. Changes no table.",
        "operationId": "create_account_merge",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountMergeCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountMergeReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Merge two accounts",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/merges/preview/": {
      "post": {
        "description": "Say what merging one account into another would move (its rows and its people), without merging.",
        "operationId": "preview_account_merge",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountMergeCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountMergePreviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview an account merge",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/merges/{from_key}/": {
      "delete": {
        "description": "Undo a merge: the account merged away shows its own rows again.",
        "operationId": "delete_account_merge",
        "parameters": [
          {
            "in": "path",
            "name": "from_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "Report what would be undone, and undo nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be undone, and undo nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such merge."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Undo an account merge",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/of-person/": {
      "get": {
        "description": "Find the account a person is on, from what an Inbox conversation, a task or a sequence contact names them by: their own row first (`table_id` with `record_id`, or `enrolment_id`'s row in its sequence's audience table), then the newest row naming their address or LinkedIn profile, so a person whose address is on another domain than their company's website is still found, then their work address's domain. Answers the account as `GET /accounts/{account_key}/` reads it, following a merge; 404 when no row puts them on one. Free.",
        "operationId": "find_person_account",
        "parameters": [
          {
            "description": "Their address.",
            "in": "query",
            "name": "email",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 320,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Their address.",
              "title": "Email"
            }
          },
          {
            "description": "Their LinkedIn profile URL.",
            "in": "query",
            "name": "linkedin_url",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 2048,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Their LinkedIn profile URL.",
              "title": "Linkedin Url"
            }
          },
          {
            "description": "Their row's table.",
            "in": "query",
            "name": "table_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Their row's table.",
              "title": "Table Id"
            }
          },
          {
            "description": "Their row, with `table_id`.",
            "in": "query",
            "name": "record_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Their row, with `table_id`.",
              "title": "Record Id"
            }
          },
          {
            "description": "Their enrolment, as a conversation or a task names it: its row.",
            "in": "query",
            "name": "enrolment_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Their enrolment, as a conversation or a task names it: its row.",
              "title": "Enrolment Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountDetailReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Find a person's account",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/owners/": {
      "get": {
        "description": "List the owners the accounts' records in connected CRMs name, the most accounts first, with the CRM each comes from and how many accounts they own: the values the list's `owner` filter takes. Spellings that differ only by case or spaces are one owner.",
        "operationId": "list_account_owners",
        "parameters": [
          {
            "in": "query",
            "name": "activity",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/AccountActivityFilter",
              "default": "with_activity",
              "description": "The owners of the accounts with outreach (the default), or of all."
            },
            "description": "The owners of the accounts with outreach (the default), or of all."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AccountOwnerReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List account owners",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/sources/": {
      "get": {
        "description": "List every table the Accounts page has looked at, and for each whether it feeds accounts, which columns its rows are read through and why, or why it does not, and the rows it leaves on no account and why (`left_off`).",
        "operationId": "list_account_sources",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForName",
              "default": "name",
              "enum": [
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AccountSourceReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List account sources",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/sources/{table_id}/": {
      "get": {
        "description": "Say whether one table feeds the Accounts page, which columns its rows are read through and why, or why it does not, and the rows it leaves on no account and why (`left_off`). A table never indexed is decided now, without storing anything.",
        "operationId": "get_account_source",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountSourceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a table's account source",
        "tags": [
          "accounts"
        ]
      },
      "patch": {
        "description": "Turn a table on or off the Accounts page, choose the column that names each row's company (when two disagree, or none is found), or the column holding each person's manager. The table is indexed again by the new settings.",
        "operationId": "update_account_source",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountSourceUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountSourceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a table's account source",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/sources/{table_id}/reach/": {
      "get": {
        "description": "Count what one table's rows put on the Accounts page, as they sit now: its rows and people, the accounts they sit on, the few it puts most on by name, and how many accounts no other table holds (they leave the list if the table is taken off). Read it before turning a table off. Free.",
        "operationId": "get_account_source_reach",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountSourceReachSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get what a table puts on Accounts",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/splits/": {
      "post": {
        "description": "Split a website out of the account its domain names, for an office folded into its company by its domain (eu.acme.com into acme.com): its rows, and those of every website under it, show on an account of their own, now and as rows are added, until it is folded back. What reps set for the people who move goes with them. Changes no table.",
        "operationId": "create_account_split",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountSplitCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountSplitReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Split a website out of an account",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/splits/preview/": {
      "post": {
        "description": "Say what splitting a website out of the account its domain names would move (its rows and its people, and those of every website under it), without splitting.",
        "operationId": "preview_account_split",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountSplitCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountSplitPreviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview splitting a website out of an account",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/splits/{host}/": {
      "delete": {
        "description": "Undo a split: the website's rows show on the account they were split out of again, with what reps set for their people.",
        "operationId": "delete_account_split",
        "parameters": [
          {
            "description": "The website split out.",
            "in": "path",
            "name": "host",
            "required": true,
            "schema": {
              "description": "The website split out.",
              "maxLength": 320,
              "minLength": 1,
              "title": "Host",
              "type": "string"
            }
          },
          {
            "description": "Report what would be undone, and undo nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be undone, and undo nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such split."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Fold a split-out website back in",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/": {
      "get": {
        "description": "Read one account by its key (its domain, or its LinkedIn page): its name, how many tables, company rows and people sit on it, and whether anybody there was reached. A key merged into another account reads the account it joined.",
        "operationId": "get_account",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountDetailReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get an account",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/facts/{kind}/": {
      "patch": {
        "description": "Pick which cell one fact about the company is shown from, when the company rows disagree (a CRM says 35,000 employees, a list says 48,000): the cell shown, or any of the fact's other values as the overview lists them. A pin beats the newest row until it is taken off (`pin` null) or its cell holds no value here any more. Returns the fact as the page shows it after the change (`fact` null when no row holds a value for it). Free.",
        "operationId": "update_account_fact",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "in": "path",
            "name": "kind",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountFactKind"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountFactUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountFactUpdatedSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Pin an account's fact",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/header/": {
      "get": {
        "description": "Read the line under an account's name: who wrote back last and when (their newest message on any channel, in a sequence or not), how many people here are in a sequence now, and each role a rep gave a person on the org chart (budget holder, champion and the rest), in the role menu's order. Free.",
        "operationId": "get_account_header",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountHeaderReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get an account's header",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/linkedin-maps/": {
      "get": {
        "description": "Where the newest map of the account's company on LinkedIn stands (waiting for the sender's browser, reading the company page, searching its people, done or failed), what one map costs at most, and how many of the buying committee the account already shows. Free.",
        "operationId": "get_account_linkedin_map",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "The company page to read the map of; the account's own when omitted.",
            "in": "query",
            "name": "company_url",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 512,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The company page to read the map of; the account's own when omitted.",
              "title": "Company Url"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountLinkedInMapReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read an account's map on LinkedIn",
        "tags": [
          "accounts"
        ]
      },
      "post": {
        "description": "Map the account's company on LinkedIn in a sender's own LinkedIn: open its company page for its facts, search its People tab for the roles that buy what the workspace sells (chosen by AI from the Business context), and keep the buying committee. The people land in a people table the account shows; the facts land in the sender's table 'LinkedIn via <sender>'. Waits for the sender's browser when it is offline, and shares the sender's daily limits with their sequences. With `fast` (the default) its two steps run a minute or two apart, between the sender's other steps, instead of each waiting the sender's Time between steps. Costs 0.1 credits for the page and 0.1 for each person read, at most `max_credits`. Refused (422) when the account has no LinkedIn page and none is given, the sender does not exist, or credits are short (`insufficient_credits`). Answers 202: the map goes on in the sender's browser, and `GET \u2026/linkedin-maps/` reads where it stands.",
        "operationId": "create_account_linkedin_map",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountLinkedInMapCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountLinkedInMapReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Map an account on LinkedIn",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/merge-suggestions/": {
      "get": {
        "description": "List the other accounts likely to be the same company as this one, to merge either way round, by fixed rules: the same LinkedIn company page, the same name once case, punctuation and a legal form like Inc go, or a domain registered under the same name (acme.com and acme.io). Strongest rule first, then most people; at most 5. Nothing is merged.",
        "operationId": "list_account_merge_suggestions",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountMergeSuggestionsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List accounts likely the same company",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/org-chart/": {
      "get": {
        "description": "Read who reports to whom at an account. Each person's line comes from the first source that gives one: a rep's edit, a table's manager column (or a CRM's reports-to field), the Person researcher, then the free draft. The first three are confirmed; the draft's lines are likely. Also the draft's likely budget holders and how many free drafts are left. Free.",
        "operationId": "get_account_org_chart",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "Draw only this many levels of each tree, while 400 cards last, and send only the people drawn and the ones the page names. Left out, the whole chart.",
            "in": "query",
            "name": "levels",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maximum": 12,
                  "minimum": 1,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Draw only this many levels of each tree, while 400 cards last, and send only the people drawn and the ones the page names. Left out, the whole chart.",
              "title": "Levels"
            }
          },
          {
            "description": "With levels: people whose reports are drawn whatever their level.",
            "in": "query",
            "name": "expand",
            "required": false,
            "schema": {
              "description": "With levels: people whose reports are drawn whatever their level.",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 500,
              "title": "Expand",
              "type": "array"
            }
          },
          {
            "description": "With levels: a person to draw the way down to.",
            "in": "query",
            "name": "focus",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "With levels: a person to draw the way down to.",
              "title": "Focus"
            }
          },
          {
            "description": "With levels: how many people with no line either way to draw.",
            "in": "query",
            "name": "loose",
            "required": false,
            "schema": {
              "default": 30,
              "description": "With levels: how many people with no line either way to draw.",
              "maximum": 5000,
              "minimum": 0,
              "title": "Loose",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountOrgChartSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get an account's org chart",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/org-chart/changes/": {
      "get": {
        "description": "List the changes reps made on an account's org chart, newest first: who changed a person's manager, role or visibility, from what to what, and when.",
        "operationId": "list_account_chart_changes",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForAt",
              "default": "at",
              "enum": [
                "at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AccountChartChangeReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an account's org chart changes",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/org-chart/drafted-lines/": {
      "get": {
        "description": "Read every reporting line the chart draws from the free draft now, each Likely until a person confirms it: who, the manager the draft guessed and why, most senior first. Also each person with drafted lines under them and how many, for confirming a whole branch at once. Free.",
        "operationId": "list_account_drafted_lines",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountDraftedLinesReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an account's drafted reporting lines",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/org-chart/drafted-lines/bulk/approve/": {
      "post": {
        "description": "Make drafted lines a person's own, as setting each person's manager would: by person_ids, or every drafted line under one person (under_person_id), at any depth. A line that is not drafted any more is left alone. Each is kept in the chart's history. Free.",
        "operationId": "approve_account_drafted_lines",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "Count the lines it would confirm, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Count the lines it would confirm, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountDraftedLinesConfirmSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountDraftedLinesBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key, or no such person on it."
          },
          "409": {
            "description": "Another draft was made since the lines were read."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Confirm an account's drafted reporting lines",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/org-chart/drafted-lines/bulk/reject/": {
      "post": {
        "description": "Say drafted lines are wrong: the chart draws them no more, and the person shows with no line until a table, the researcher, or a person gives one. Every later draft that guesses the same manager keeps it dismissed. Kept in the chart's history; restore takes it back. Free.",
        "operationId": "reject_account_drafted_lines",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "Count the lines it would call wrong, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Count the lines it would call wrong, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountDraftedLinesDismissSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountDraftedLinesBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "409": {
            "description": "Another draft was made since the lines were read."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Reject an account's drafted reporting lines",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/org-chart/drafted-lines/bulk/restore/": {
      "post": {
        "description": "Take back a reject: the draft's guess for each person draws again, Likely, and the chart's history says who took it back. Free.",
        "operationId": "restore_account_drafted_lines",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "Count the lines it would draw again, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Count the lines it would draw again, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountDraftedLinesRestoreSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountDraftedLinesBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Restore an account's rejected drafted lines",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/org-chart/drafts/": {
      "post": {
        "description": "Ask AI to draft the reporting lines no source gives, from the people's titles, and name up to three likely budget holders. Free, and kept until the people change: asking again over the same people reuses the draft (200, nothing asked) rather than making one (201). A workspace has 25 free drafts a day; past that the ask is refused (409) and the chart stays as it was. Never overrides a line a rep, a table or the researcher gives.",
        "operationId": "create_account_org_chart_draft",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "Draw only this many levels of each tree, while 400 cards last, and send only the people drawn and the ones the page names. Left out, the whole chart.",
            "in": "query",
            "name": "levels",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maximum": 12,
                  "minimum": 1,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Draw only this many levels of each tree, while 400 cards last, and send only the people drawn and the ones the page names. Left out, the whole chart.",
              "title": "Levels"
            }
          },
          {
            "description": "With levels: people whose reports are drawn whatever their level.",
            "in": "query",
            "name": "expand",
            "required": false,
            "schema": {
              "description": "With levels: people whose reports are drawn whatever their level.",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 500,
              "title": "Expand",
              "type": "array"
            }
          },
          {
            "description": "With levels: a person to draw the way down to.",
            "in": "query",
            "name": "focus",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "With levels: a person to draw the way down to.",
              "title": "Focus"
            }
          },
          {
            "description": "With levels: how many people with no line either way to draw.",
            "in": "query",
            "name": "loose",
            "required": false,
            "schema": {
              "default": 30,
              "description": "With levels: how many people with no line either way to draw.",
              "maximum": 5000,
              "minimum": 0,
              "title": "Loose",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountChartDraftReadSchema"
                }
              }
            },
            "description": "The draft on file was made over these same people: it was reused."
          },
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountChartDraftReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "409": {
            "description": "No free drafts are left. The org chart says when the next one frees up."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountDraftFailedSchema"
                }
              }
            },
            "description": "The draft could not be made."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Draft an account's org chart",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/org-chart/lost/": {
      "delete": {
        "description": "Forget the role and the reporting line reps set for someone no longer at the account, the lines reps drew to them as a manager, and the chart's notices that they left (entries of the chart's lost list with this person_key). Until then all are kept, and come back if a row names the person there again (the entry's can_return). Only what the chart read goes: an edit saved since stands. Kept in the chart's history.",
        "operationId": "forget_account_chart_loss",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "The person, as lost names them.",
            "in": "query",
            "name": "person_key",
            "required": true,
            "schema": {
              "description": "The person, as lost names them.",
              "maxLength": 512,
              "minLength": 1,
              "title": "Person Key",
              "type": "string"
            }
          },
          {
            "description": "Report whether it would be forgotten, and forget nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report whether it would be forgotten, and forget nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key, or the chart lost nobody by that key."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Forget a person an account's org chart lost",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/overview/": {
      "get": {
        "description": "Read what an account's page shows above its tabs: each fact about the company (industry, size, location and the like), as the cell a rep pinned or else the newest value the company rows hold, with the table and column it came from, how many other cells agree and every other value the rows give; and a card for every table holding rows on it. Free.",
        "operationId": "get_account_overview",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountOverviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get an account's overview",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/people-search/": {
      "get": {
        "description": "Write the Find leads people search the account page's Find more people opens: every website the account answers to (its own, then each merged into it) and the job titles to look for. The titles follow a fixed order: the roles the workspace's Business context names, as Find leads' starter searches read them (`business_context`), else the titles the people already on the account hold, the most common first (`account_people`), else none. Nothing is searched and nothing is spent: run it with the people search. The roles are written by a model once per Business context, so a key that can only read is refused.",
        "operationId": "get_account_people_search",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountPeopleSearchReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Write the people search for finding more people at an account",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/people/": {
      "get": {
        "description": "List the people at an account, each once however many tables name them: their name and title, how old that is, the rows they are on, and every sequence they are or were in, with when they were last contacted and when they replied, their title's seniority and department, what is known of their address, the role a rep set, and the others there going by the same name (`namesakes`: `likely_same` when nothing tells them apart, as a merge often leaves one person). `search` keeps the people whose name, title or address holds the text; the other filters each keep any of their values, and together all of them. Ordered by name, title, seniority (most senior first), department or `last_contacted_at`; people with nothing in that column come last either way.",
        "operationId": "list_account_people",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "in": "query",
            "name": "department",
            "required": false,
            "schema": {
              "description": "Only people whose title names one of these departments, or `none` for a title naming none; repeat for several.",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AccountDepartment"
                  },
                  {
                    "const": "none",
                    "type": "string"
                  }
                ]
              },
              "maxItems": 14,
              "title": "Department",
              "type": "array"
            },
            "description": "Only people whose title names one of these departments, or `none` for a title naming none; repeat for several."
          },
          {
            "in": "query",
            "name": "email_status",
            "required": false,
            "schema": {
              "description": "Only people whose address is one of these (a Verify email column's verdict, or bounced), or `none` for an address nothing checked; repeat for several.",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AccountEmailStatus"
                  },
                  {
                    "const": "none",
                    "type": "string"
                  }
                ]
              },
              "maxItems": 8,
              "title": "Email Status",
              "type": "array"
            },
            "description": "Only people whose address is one of these (a Verify email column's verdict, or bounced), or `none` for an address nothing checked; repeat for several."
          },
          {
            "in": "query",
            "name": "namesake",
            "required": false,
            "schema": {
              "description": "Only people another person at the account goes by the same name as: `likely_same` when nothing tells them apart (likely one person found twice), `same_name` when each has a LinkedIn profile of their own or the name is short of a full one. A person with both kinds among their namesakes is kept by either; repeat for both.",
              "items": {
                "$ref": "#/components/schemas/AccountNamesake"
              },
              "maxItems": 2,
              "title": "Namesake",
              "type": "array"
            },
            "description": "Only people another person at the account goes by the same name as: `likely_same` when nothing tells them apart (likely one person found twice), `same_name` when each has a LinkedIn profile of their own or the name is short of a full one. A person with both kinds among their namesakes is kept by either; repeat for both."
          },
          {
            "in": "query",
            "name": "role",
            "required": false,
            "schema": {
              "description": "Only people a rep gave one of these roles on the org chart, or `none` for no role; repeat for several.",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AccountPersonRole"
                  },
                  {
                    "const": "none",
                    "type": "string"
                  }
                ]
              },
              "maxItems": 7,
              "title": "Role",
              "type": "array"
            },
            "description": "Only people a rep gave one of these roles on the org chart, or `none` for no role; repeat for several."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Text found in the person's name, title or address.",
              "title": "Search"
            },
            "description": "Text found in the person's name, title or address."
          },
          {
            "in": "query",
            "name": "seniority",
            "required": false,
            "schema": {
              "description": "Only people whose title's seniority is one of these, or `none` for no title; repeat for several.",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AccountSeniority"
                  },
                  {
                    "const": "none",
                    "type": "string"
                  }
                ]
              },
              "maxItems": 8,
              "title": "Seniority",
              "type": "array"
            },
            "description": "Only people whose title's seniority is one of these, or `none` for no title; repeat for several."
          },
          {
            "in": "query",
            "name": "table",
            "required": false,
            "schema": {
              "description": "Only people with a row on one of these tables, by id (a table card's View all); repeat for several.",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "title": "Table",
              "type": "array"
            },
            "description": "Only people with a row on one of these tables, by id (a table card's View all); repeat for several."
          },
          {
            "in": "query",
            "name": "title",
            "required": false,
            "schema": {
              "description": "Only people with one of these titles, whole and in any case (`none` for no title), as `GET .../people/facets/` names them; repeat for several.",
              "items": {
                "maxLength": 255,
                "type": "string"
              },
              "maxItems": 100,
              "title": "Title",
              "type": "array"
            },
            "description": "Only people with one of these titles, whole and in any case (`none` for no title), as `GET .../people/facets/` names them; repeat for several."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNameTitleSeniorityDepartmentLastContactedAt",
              "default": "name",
              "enum": [
                "name",
                "title",
                "seniority",
                "department",
                "last_contacted_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AccountPersonReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an account's people",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/people/facets/": {
      "get": {
        "description": "Say what each of the People tab's filters offers: the seniorities, departments, titles (the 50 most common), roles and address verdicts the account's people hold, with how many hold each, and how many have a namesake of each kind (`namesake`; one person may count under both). `none` counts the people with none.",
        "operationId": "list_account_people_facets",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountPeopleFacetsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count an account's people by each People filter",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/people/length/": {
      "get": {
        "description": "How many people at an account `GET /accounts/{account_key}/people/` keeps for the same `search` and filters: the total its pages add up to.",
        "operationId": "count_account_people",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "description": "Text found in the person's name, title or address.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Text found in the person's name, title or address.",
              "title": "Search"
            }
          },
          {
            "description": "Only people whose title's seniority is one of these, or `none` for no title; repeat for several.",
            "in": "query",
            "name": "seniority",
            "required": false,
            "schema": {
              "description": "Only people whose title's seniority is one of these, or `none` for no title; repeat for several.",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AccountSeniority"
                  },
                  {
                    "const": "none",
                    "type": "string"
                  }
                ]
              },
              "maxItems": 8,
              "title": "Seniority",
              "type": "array"
            }
          },
          {
            "description": "Only people whose title names one of these departments, or `none` for a title naming none; repeat for several.",
            "in": "query",
            "name": "department",
            "required": false,
            "schema": {
              "description": "Only people whose title names one of these departments, or `none` for a title naming none; repeat for several.",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AccountDepartment"
                  },
                  {
                    "const": "none",
                    "type": "string"
                  }
                ]
              },
              "maxItems": 14,
              "title": "Department",
              "type": "array"
            }
          },
          {
            "description": "Only people with one of these titles, whole and in any case (`none` for no title), as `GET .../people/facets/` names them; repeat for several.",
            "in": "query",
            "name": "title",
            "required": false,
            "schema": {
              "description": "Only people with one of these titles, whole and in any case (`none` for no title), as `GET .../people/facets/` names them; repeat for several.",
              "items": {
                "maxLength": 255,
                "type": "string"
              },
              "maxItems": 100,
              "title": "Title",
              "type": "array"
            }
          },
          {
            "description": "Only people a rep gave one of these roles on the org chart, or `none` for no role; repeat for several.",
            "in": "query",
            "name": "role",
            "required": false,
            "schema": {
              "description": "Only people a rep gave one of these roles on the org chart, or `none` for no role; repeat for several.",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AccountPersonRole"
                  },
                  {
                    "const": "none",
                    "type": "string"
                  }
                ]
              },
              "maxItems": 7,
              "title": "Role",
              "type": "array"
            }
          },
          {
            "description": "Only people whose address is one of these (a Verify email column's verdict, or bounced), or `none` for an address nothing checked; repeat for several.",
            "in": "query",
            "name": "email_status",
            "required": false,
            "schema": {
              "description": "Only people whose address is one of these (a Verify email column's verdict, or bounced), or `none` for an address nothing checked; repeat for several.",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AccountEmailStatus"
                  },
                  {
                    "const": "none",
                    "type": "string"
                  }
                ]
              },
              "maxItems": 8,
              "title": "Email Status",
              "type": "array"
            }
          },
          {
            "description": "Only people another person at the account goes by the same name as: `likely_same` when nothing tells them apart (likely one person found twice), `same_name` when each has a LinkedIn profile of their own or the name is short of a full one. A person with both kinds among their namesakes is kept by either; repeat for both.",
            "in": "query",
            "name": "namesake",
            "required": false,
            "schema": {
              "description": "Only people another person at the account goes by the same name as: `likely_same` when nothing tells them apart (likely one person found twice), `same_name` when each has a LinkedIn profile of their own or the name is short of a full one. A person with both kinds among their namesakes is kept by either; repeat for both.",
              "items": {
                "$ref": "#/components/schemas/AccountNamesake"
              },
              "maxItems": 2,
              "title": "Namesake",
              "type": "array"
            }
          },
          {
            "description": "Only people with a row on one of these tables, by id (a table card's View all); repeat for several.",
            "in": "query",
            "name": "table",
            "required": false,
            "schema": {
              "description": "Only people with a row on one of these tables, by id (a table card's View all); repeat for several.",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "title": "Table",
              "type": "array"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountPeopleCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count an account's people",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/people/{person_id}/": {
      "get": {
        "description": "Read one person at an account, as the people list says them: their name and title, how old that is, the rows they are on, every sequence they are or were in, when they were last contacted and replied, their title's seniority and department, what is known of their address, and the role a rep set.",
        "operationId": "get_account_person",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "in": "path",
            "name": "person_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Person Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountPersonReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key, or no such person on it."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get one person at an account",
        "tags": [
          "accounts"
        ]
      },
      "patch": {
        "description": "Set who a person reports to (a person on the chart, nobody here, or back to what the tables and the draft say), their part in a deal (champion, budget holder, decision maker, influencer, user, blocker), or hide them from the chart. A rep's line beats every other source. A field left out stays as it is; null hands the line back, or says the part is not known. Returns the person as the chart shows them after the change.",
        "operationId": "update_account_person",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "in": "path",
            "name": "person_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Person Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountPersonUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountChartPersonReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key, or no such person on it."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a person on an account's org chart",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/people/{person_id}/manager-loops/": {
      "get": {
        "description": "Everyone who already reports up to the person, before their manager is picked: picking one of them loops. A pick marked refused (every line on the way is one people here set) is refused when saved; any other is allowed, and the table's or the researcher's line on the way gives way to it.",
        "operationId": "list_account_person_manager_loops",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          },
          {
            "in": "path",
            "name": "person_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Person Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountManagerLoopsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key, or no such person on it."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List who a person's manager pick would loop through",
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{account_key}/websites/": {
      "get": {
        "description": "List the websites under an account's domain its rows came from (eu.acme.com under acme.com), most rows first, which may be split out to accounts of their own; and what was split out of it, or it out of.",
        "operationId": "get_account_websites",
        "parameters": [
          {
            "in": "path",
            "name": "account_key",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountKeyPath"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountWebsitesReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No account by that key in this workspace."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the websites under an account",
        "tags": [
          "accounts"
        ]
      }
    },
    "/affiliate/enroll/": {
      "post": {
        "description": "Enroll the caller's workspace, idempotently: enrolling twice returns the existing profile. Open self-serve: the program's gates live at payout, not at the door. Requires a signed-in user rather than an API key, because enrollment records who the affiliate is.",
        "operationId": "enroll_affiliate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AffiliateEnrollRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AffiliateProfileReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Enroll in the affiliate program",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/feed/": {
      "get": {
        "description": "Signups, conversions and money movements as an anonymous feed, newest first, a page at a time. Rows say what happened, never who; the ledger itemizes the money.",
        "operationId": "list_affiliate_feed",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForOccurredAt",
              "default": "occurred_at",
              "enum": [
                "occurred_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AffiliateFeedItemReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the affiliate activity feed",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/ledger/": {
      "get": {
        "description": "The itemized, signed history of every commission, clawback, payout and adjustment, newest first.",
        "operationId": "list_affiliate_ledger_entries",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdOccurredAtCreatedAt",
              "default": "occurred_at",
              "enum": [
                "id",
                "occurred_at",
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AffiliateLedgerEntryReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the affiliate ledger",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/payouts/": {
      "get": {
        "description": "The caller's monthly payouts, newest first.",
        "operationId": "list_affiliate_payouts",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtPeriod",
              "default": "period",
              "enum": [
                "id",
                "created_at",
                "period"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AffiliatePayoutReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List payouts",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/performance/": {
      "get": {
        "description": "The overview's whole measurement surface in one read: the click, signup, conversion and earnings funnel over a window with each step against the equally long window before it; the rates over those steps; lifetime gross, clawed-back and net commission; where the referral roster stands; when pending commission matures; and what the next monthly payout run would send. A rate whose denominator is too small to state honestly comes back null rather than as a number nobody should act on.",
        "operationId": "get_affiliate_performance",
        "parameters": [
          {
            "description": "The window these figures cover.",
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 30,
              "description": "The window these figures cover.",
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AffiliatePerformanceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not enrolled."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the affiliate performance figures",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/program/": {
      "get": {
        "description": "What the program pays right now, for the landing page and the signup flow. Deliberately unauthenticated: the person who most needs it has no account yet. Terms only: nothing here resolves a code to the person behind it.",
        "operationId": "get_affiliate_program",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AffiliateProgramReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "summary": "Get the affiliate program's current terms",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/referrals/": {
      "get": {
        "description": "The affiliate's referrals with the terms and money attached to each, newest first. Anonymous by design, like the feed: a row says what a referral pays and under which stamped rate, never who it is.",
        "operationId": "list_affiliate_referrals",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdSignedUpAt",
              "default": "signed_up_at",
              "enum": [
                "id",
                "signed_up_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AffiliateReferralReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the affiliate referrals",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/settings/": {
      "patch": {
        "description": "Set the PayPal account payouts are sent to, claim the affiliate's one custom code, or both in one call. Send only what changes. Every change of the payout email restarts the destination hold: a payout will not use an email set within the last few days. The custom code is the name a creator says out loud instead of a random string: first come, first served across the whole program, claimed once and public from then on. When the code is refused, the email is not saved either. Requires a signed-in user, because this is where the money goes and the code is the affiliate's public name, so an API key is not enough.",
        "operationId": "update_affiliate_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AffiliateSettingsUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AffiliateSettingsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not enrolled."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update the affiliate settings",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/sources/": {
      "get": {
        "description": "How each traffic source the affiliate tagged has performed, best-earning first, a page at a time. A source is the affiliate's own `s=` parameter on a link they shared; untagged traffic comes back under an empty source.",
        "operationId": "list_affiliate_source_stats",
        "parameters": [
          {
            "description": "How many days back to include.",
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 90,
              "description": "How many days back to include.",
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AffiliateSourceStatReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the affiliate per-source performance",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/stats/": {
      "get": {
        "description": "The dashboard's headline numbers on their own, for cheap refreshes.",
        "operationId": "get_affiliate_stats",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AffiliateStatsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the affiliate headline stats",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/summary/": {
      "get": {
        "description": "Standing, codes, the shareable link, the headline stats and the program terms: everything the dashboard's overview needs in one read.",
        "operationId": "get_affiliate_summary",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AffiliateSummaryReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not enrolled."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the affiliate dashboard summary",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/timeseries/": {
      "get": {
        "description": "The per-day series behind the dashboard graphs: signups, paying conversions and earnings per day, up to one year back, oldest first. Days with no activity come back as zeroes. The whole window comes in one answer, so there is no next page.",
        "operationId": "list_affiliate_daily_stats",
        "parameters": [
          {
            "description": "How many days back to include.",
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 365,
              "description": "How many days back to include.",
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AffiliateDailyStatReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the affiliate per-day stats",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/affiliate/verification-sessions/": {
      "post": {
        "description": "Create the hosted identity-verification flow and return its URL. The dashboard shows this only once a payout is actually available. Requires a signed-in user rather than an API key, and is rationed: each verification costs a fee, and starting one is a step a person takes, not a script.",
        "operationId": "start_affiliate_verification",
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IdentityVerificationReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not enrolled."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Start identity verification",
        "tags": [
          "affiliate"
        ]
      }
    },
    "/agent-learnings/": {
      "get": {
        "description": "The one-line rules an agent follows on every output, taught by thumbs downs, oldest first. Name a saved agent, or a table column to read the learnings of the agent it runs (a column linked to a saved agent answers with that agent's). Add `account` for the ones every sequence's writer follows, first: alone, it lists only those. An agent keeps at most 30 and all sequences 30, so they come on one page. A sequence's writer reads both lists: when two disagree, the sequence's own wins.",
        "operationId": "list_agent_learnings",
        "parameters": [
          {
            "description": "The saved agent. Not together with `column_id`.",
            "in": "query",
            "name": "saved_agent_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The saved agent. Not together with `column_id`.",
              "title": "Saved Agent Id"
            }
          },
          {
            "description": "A table column: answers with the learnings of the agent it runs, its saved agent's when it is linked to one, else its own; none for a column that runs no agent.",
            "in": "query",
            "name": "column_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A table column: answers with the learnings of the agent it runs, its saved agent's when it is linked to one, else its own; none for a column that runs no agent.",
              "title": "Column Id"
            }
          },
          {
            "description": "List the learnings every sequence's writer follows (All sequences, at most 30): alone, only those; beside an agent, those first and then the agent's, the order a sequence's writer reads them in.",
            "in": "query",
            "name": "account",
            "required": false,
            "schema": {
              "default": false,
              "description": "List the learnings every sequence's writer follows (All sequences, at most 30): alone, only those; beside an agent, those first and then the agent's, the order a sequence's writer reads them in.",
              "title": "Account",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AgentLearningReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an agent's learnings",
        "tags": [
          "agent-learnings"
        ]
      },
      "post": {
        "description": "Add one learning a person wrote, in their own words: the agent follows it from its next output. Name who keeps it as the list is read: a saved agent, a column (the agent it runs), or `account` for all sequences. It takes a free place in that list and is refused when the list is full. A sequence's or all sequences' learning rewrites the waiting messages it reaches. Only a signed-in person can, never an API key.",
        "operationId": "create_agent_learning",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentLearningCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentLearningReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Agent not found"
          },
          "409": {
            "description": "The list it joins is full."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Add a learning",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/bulk/promote/": {
      "post": {
        "description": "Keep a rule several sequences share once, for all sequences: name every copy in `ids`. Its newest copy moves there, keeping its history, and the other copies are removed; when all sequences keep it already, only the copies go. `updated` counts the copies this call moved or removed (a copy edited meanwhile stays); a copy that is gone or says another rule refuses the whole move. Only a signed-in person can, never an API key.",
        "operationId": "bulk_promote_agent_learnings",
        "parameters": [
          {
            "description": "Check it and answer the rule as all sequences would keep it.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Check it and answer the rule as all sequences would keep it.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentLearningPromoteSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentLearningBulkPromoteResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Learning not found"
          },
          "409": {
            "description": "All sequences' list is full, or the rule changed meanwhile."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Move a shared rule to all sequences",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/hand-edits/": {
      "post": {
        "description": "Propose a learning from a person's own edit of one message the agent wrote: a Tasks card's words, a follow-up or Builder message not sent yet, one contact's own words for a step in the Builder, or a reply draft. The edit is already kept (each place saves its own words); this reads the words before and after on the server and proposes what the agent should do differently, with the notes of any proposal waiting on the message, which it replaces. Nothing is written again. It is saved only by the page's yes (Approve, Looks good or sending the reply, or `POST /agent-learnings/thumbs-downs/{event_id}/commit/`), sharpened by a further note (`POST /agent-learnings/thumbs-downs/` with the same `hand_edit` subject), and dropped by Discard feedback (`POST /agent-learnings/thumbs-downs/{event_id}/revert/`), which keeps the edit. Words back as the agent wrote them, or changed only in spacing, call no model: a learning proposed from an earlier edit is dismissed and answered with 200, otherwise it is refused. Sent again with the same `request_id`, it answers what the first one did. Only a signed-in person can, never an API key.",
        "operationId": "propose_learning_from_edit",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HandEditCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThumbsDownReadSchema"
                }
              }
            },
            "description": "The words are back as the agent wrote them: the learning proposed from an earlier edit is dismissed, and `proposal` is null."
          },
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThumbsDownReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The words you edited no longer exist."
          },
          "409": {
            "description": "Nothing to learn: the words match the agent's or a learning you dismissed, the learner found nothing, the words can't teach here (a decided task, a sent message), they were edited again meanwhile, the workspace learned from 200 edits today, the message was edited 10 times with its learning still waiting, or its feedback session holds 20 notes already; the sentence says which."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "description": "The agent could not read the edit right now (its model, or today's count of learning from edits, is out of reach). The edit is kept, and so is any learning waiting on it; try again shortly."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Propose a learning from an edit",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/overlap/": {
      "get": {
        "description": "The rules two or more sequences each keep for themselves, word for word, most-shared first, and whether all sequences' list is full. Each rule could be kept once for all sequences instead (`POST /agent-learnings/bulk/promote/`). A rule naming one step is that sequence's alone and is never listed.",
        "operationId": "get_learning_overlap",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LearningOverlapReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read the rules several sequences share",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/quote/": {
      "get": {
        "description": "What writing the output again would cost if a thumbs down were given on this subject, and whether the workspace can pay for it now. Name the subject by its `kind` and the ids that kind takes. Free and nothing redone answers 0 credits.",
        "operationId": "quote_thumbs_down",
        "parameters": [
          {
            "in": "query",
            "name": "kind",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/FeedbackSubjectKind"
            }
          },
          {
            "in": "query",
            "name": "table_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Table Id"
            }
          },
          {
            "in": "query",
            "name": "column_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Column Id"
            }
          },
          {
            "in": "query",
            "name": "record_ids",
            "required": false,
            "schema": {
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 50,
              "title": "Record Ids",
              "type": "array"
            }
          },
          {
            "in": "query",
            "name": "saved_agent_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Saved Agent Id"
            }
          },
          {
            "in": "query",
            "name": "row_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Row Id"
            }
          },
          {
            "in": "query",
            "name": "task_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Task Id"
            }
          },
          {
            "in": "query",
            "name": "outbound_message_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Outbound Message Id"
            }
          },
          {
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Sequence Id"
            }
          },
          {
            "in": "query",
            "name": "record_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Record Id"
            }
          },
          {
            "in": "query",
            "name": "draft_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Draft Id"
            }
          },
          {
            "in": "query",
            "name": "message_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Message Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "What you rated no longer exists."
          },
          "409": {
            "description": "A thumbs down can't be given here; the sentence says why."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Price a thumbs down's redo",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/requests/": {
      "post": {
        "description": "Do what one of four routes does without waiting for it, since the agent can take longer to learn than a request may stay open: `kind` `thumbs_down` gives a thumbs down (`POST /agent-learnings/thumbs-downs/`), `hand_edit` proposes a learning from an edit (`POST /agent-learnings/hand-edits/`), `regenerate` retries a proposed learning (`POST /agent-learnings/thumbs-downs/{event_id}/regenerate/`) and `proposal_change` changes one (`PATCH /agent-learnings/thumbs-downs/{event_id}/proposal/`), each with that route's body. Answers at once with where it stands; ask `GET /agent-learnings/requests/{request_id}/` every couple of seconds until it is `done` (with the answer a thumbs down gives) or `failed` (with the status and sentence that route would have refused with). The agent gets two minutes to learn. Sent again with the same `request_id`, it answers the same request; after it failed, it runs again. Only a signed-in person can, never an API key.",
        "operationId": "start_learning_request",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "discriminator": {
                  "mapping": {
                    "hand_edit": "#/components/schemas/HandEditRequestCreateSchema",
                    "proposal_change": "#/components/schemas/ProposalChangeRequestCreateSchema",
                    "regenerate": "#/components/schemas/RegenerateRequestCreateSchema",
                    "thumbs_down": "#/components/schemas/ThumbsDownRequestCreateSchema"
                  },
                  "propertyName": "kind"
                },
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/ThumbsDownRequestCreateSchema"
                  },
                  {
                    "$ref": "#/components/schemas/HandEditRequestCreateSchema"
                  },
                  {
                    "$ref": "#/components/schemas/RegenerateRequestCreateSchema"
                  },
                  {
                    "$ref": "#/components/schemas/ProposalChangeRequestCreateSchema"
                  }
                ],
                "title": "Create"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LearningRequestReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This Needs work no longer exists. Refresh the page."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Start a learning request in the background",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/requests/{request_id}/": {
      "get": {
        "description": "Where a learning request started with `POST /agent-learnings/requests/` stands: `running`, `done` with what it did, or `failed` with why.",
        "operationId": "get_learning_request",
        "parameters": [
          {
            "in": "path",
            "name": "request_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Request Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LearningRequestReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This was never sent. Try again."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a learning request",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/sent-messages/{message_id}/looks-good/": {
      "put": {
        "description": "Record Looks good on a message the agent sent, an email or a reply. It teaches nothing; a learning a Needs work left proposed on it is saved, and the answer counts it in `saved_learnings`. Like any saved learning, it writes again the waiting messages that it reaches, in Tasks and waiting to send. Refused while that Needs work's would have written is still being written, or was refused, and then nothing is recorded. Marked twice, the second changes nothing. With `rev`, it saves the session only as the page showed it. Only a signed-in person can, never an API key.",
        "operationId": "mark_sent_message_looks_good",
        "parameters": [
          {
            "in": "path",
            "name": "message_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Message Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          },
          {
            "description": "The message's feedback session `rev` as read. When sent, a session a note or an edit changed since is refused (409) and nothing is recorded; left out, it is saved as it stands.",
            "in": "query",
            "name": "rev",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The message's feedback session `rev` as read. When sent, a session a note or an edit changed since is refused (409) and nothing is recorded; left out, it is saved as it stands.",
              "title": "Rev"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SentLooksGoodReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Message not found"
          },
          "409": {
            "description": "The message never went out, the Needs work's would have written is not in yet or was refused, or its feedback session moved on since the `rev` sent; the sentence says which."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Mark a sent message Looks good",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/thumbs-downs/": {
      "get": {
        "description": "The thumbs downs given on one subject or several (`subject_key`, repeated), newest first, each with the learning it wrote, how its redo and any Undo went, and the subject it was given on: the notes shown in place. An Inbox conversation reads every sent message's notes in one call.",
        "operationId": "list_thumbs_downs",
        "parameters": [
          {
            "description": "The subjects, as the thumbs down's surface keys them, one or more: `message:<id>` for a sent message; the other surfaces' keys are documented with them.",
            "in": "query",
            "name": "subject_key",
            "required": true,
            "schema": {
              "description": "The subjects, as the thumbs down's surface keys them, one or more: `message:<id>` for a sent message; the other surfaces' keys are documented with them.",
              "items": {
                "maxLength": 160,
                "minLength": 1,
                "type": "string"
              },
              "maxItems": 100,
              "minItems": 1,
              "title": "Subject Key",
              "type": "array"
            }
          },
          {
            "description": "Only the thumbs downs given on this row's cell, for a column's `cells:<column id>` subject: one cell's notes, however many rows of the column were rated since.",
            "in": "query",
            "name": "record_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the thumbs downs given on this row's cell, for a column's `cells:<column id>` subject: one cell's notes, however many rows of the column were rated since.",
              "title": "Record Id"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ThumbsDownEventReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the thumbs downs on some subjects",
        "tags": [
          "agent-learnings"
        ]
      },
      "post": {
        "description": "Say what is wrong with something an agent wrote. The note joins the item's feedback session (one per message, per column's cells, per Preview example), which proposes short learnings and waits until a person saves it (`/commit/`) or discards it (`/revert/`); nothing is learned before. The output is written again with the session's changes: an outbound message on one of the day's free rewrites; a table's cells or a Preview example are run again, paid as Run cells is, and with no credits left the note still proposes and nothing runs. A later note asks again with every note, the latest winning. Sent again with the same `request_id`, it answers what the first one did. Only a signed-in person can, never an API key.",
        "operationId": "create_thumbs_down",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ThumbsDownCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThumbsDownReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "What you rated no longer exists."
          },
          "409": {
            "description": "It can't be given here (the sentence says why), the agent keeps 30 learnings already, its learnings changed meanwhile, the last note's rewrite or run is still going, its feedback session was saved or discarded meanwhile, or it holds 20 notes already. On a `hand_edit` subject: nothing waits to sharpen, or the workspace learned from 200 edits today."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "429": {
            "description": "The workspace used today's free rewrites (feedback notes and Retry). They reset at midnight UTC."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "description": "The agent could not read the edit right now (its model, or today's count of learning from edits, is out of reach). The edit is kept, and so is any learning waiting on it; try again shortly."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Give a thumbs down",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/thumbs-downs/{event_id}/": {
      "get": {
        "description": "One thumbs down by its id, as the list on its subject shows it: the learning it wrote or proposes, and how its redo and any Undo went.",
        "operationId": "get_thumbs_down",
        "parameters": [
          {
            "in": "path",
            "name": "event_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Event Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThumbsDownEventReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Thumbs down not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a thumbs down",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/thumbs-downs/{event_id}/changes/{change_id}/": {
      "patch": {
        "description": "While a feedback session waits, change one of its changes before the page's yes (Approve, Send, Looks good) saves every change still on: leave it out (`off`) or bring it back, edit its words, or switch who it applies to. Send the session's `rev` as read; a change made against an older set is refused. The words on screen still follow the set as it was: ask for a rewrite (`/regenerate/`) to write them again. Only a signed-in person can, never an API key.",
        "operationId": "update_session_change",
        "parameters": [
          {
            "in": "path",
            "name": "event_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Event Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "change_id",
            "required": true,
            "schema": {
              "maxLength": 12,
              "minLength": 2,
              "title": "Change Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionChangeUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThumbsDownEventReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Session or change not found"
          },
          "409": {
            "description": "It was saved or discarded meanwhile, or a note or another edit changed the set since it was read: read it again."
          },
          "422": {
            "description": "The change's kind does not take this edit."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change one change of a feedback session",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/thumbs-downs/{event_id}/commit/": {
      "post": {
        "description": "Save what a feedback session proposes, each change at its scope: the Feedback column's yes. Approving the rewritten task or reply, or Looks good on the rewritten Preview contact, saves it too. An outbound session is refused while the message is still being rewritten; a table's (cells, a Preview example) saves whenever asked and runs nothing again. Every change it makes is saved at once (adds, rewrites, deletes); one whose list is full, or whose learning was edited meanwhile, is left out and says so in `changes[].outcome`. Saving writes again the waiting messages the changes reach, in Tasks and waiting to send (at most 5 a channel per sequence; for all sequences, at most 5 in the whole workspace, soonest sending first). Saved twice, it answers the first save. Only a signed-in person can, never an API key.",
        "operationId": "save_proposed_learning",
        "parameters": [
          {
            "in": "path",
            "name": "event_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Event Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ProposalCommitSchema"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Commit"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedProposalReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Thumbs down not found"
          },
          "409": {
            "description": "It was discarded, its rewrite is not in yet or was refused, every list it would join is full, or the changes moved on since the `rev` sent; the sentence says which."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Save a proposed learning",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/thumbs-downs/{event_id}/proposal/": {
      "patch": {
        "description": "Change a proposed learning's words, or who it applies to (this sequence, or every sequence), before it is saved. Switching one that names a step to every sequence rewords it to name none. Only a signed-in person can, never an API key.",
        "operationId": "update_proposed_learning",
        "parameters": [
          {
            "in": "path",
            "name": "event_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Event Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProposalUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThumbsDownEventReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Thumbs down not found"
          },
          "409": {
            "description": "It was saved or discarded meanwhile, or it makes more than one change, which is saved as it is."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change a proposed learning",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/thumbs-downs/{event_id}/regenerate/": {
      "post": {
        "description": "Write the message again for a proposed learning whose rewrite failed (Couldn't rewrite: Retry). Only a signed-in person can, never an API key.",
        "operationId": "retry_proposed_rewrite",
        "parameters": [
          {
            "in": "path",
            "name": "event_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Event Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThumbsDownReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Thumbs down not found"
          },
          "409": {
            "description": "It was saved or discarded, a rewrite is still being written, or another note changed it meanwhile."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "429": {
            "description": "The workspace used today's free rewrites (feedback notes and Retry). They reset at midnight UTC."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rewrite again for a proposed learning",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/thumbs-downs/{event_id}/revert/": {
      "post": {
        "description": "Discard the feedback of a thumbs down, as Discard feedback in its Feedback column does while it waits: every change it proposed is dropped, and the output it redid is put back, now or once the redo finishes. On feedback already saved it takes back what it saved (the learning it added is removed, the one it rewrote says what it said before, unless someone changed it since). Sent twice, it answers what the first call did. With `split`, it puts back the original prompt a release split shortened instead, and removes the learnings split from it; each kind of event is not found without its own flag. On a learning proposed from a person's edit it is Discard feedback too: the learning is dropped and the edit is kept, since there is no rewrite to put back. Only a signed-in person can, never an API key.",
        "operationId": "revert_thumbs_down",
        "parameters": [
          {
            "in": "path",
            "name": "event_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Event Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          },
          {
            "description": "Put back the original prompt of a release split: the event must be the split. Without it, the event must be a thumbs down's.",
            "in": "query",
            "name": "split",
            "required": false,
            "schema": {
              "default": false,
              "description": "Put back the original prompt of a release split: the event must be the split. Without it, the event must be a thumbs down's.",
              "title": "Split",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RevertReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Thumbs down not found, or prompt split not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Discard a thumbs down's feedback",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/versions/": {
      "get": {
        "description": "Every write of a learning, newest first: added, rewritten, moved, deleted or restored, each with its words then and the feedback session that made it. Name one learning (`learning_id`, a deleted one included), or every learning one agent kept: a saved agent's (`saved_agent_id`), an unlinked column's (`column_id`) or all sequences' (`all_sequences=true`). With `action`, only one kind of write: `action=deleted` lists the learnings that can be put back. Restore one to roll a change back.",
        "operationId": "list_learning_versions",
        "parameters": [
          {
            "in": "query",
            "name": "action",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LearningVersionAction"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the versions one kind of write made: `deleted` lists the learnings that can be put back. Left out, every write."
            },
            "description": "Only the versions one kind of write made: `deleted` lists the learnings that can be put back. Left out, every write."
          },
          {
            "in": "query",
            "name": "all_sequences",
            "required": false,
            "schema": {
              "default": false,
              "description": "Every version of the learnings all sequences share.",
              "title": "All Sequences",
              "type": "boolean"
            },
            "description": "Every version of the learnings all sequences share."
          },
          {
            "in": "query",
            "name": "column_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Every version of the learnings an unlinked column kept.",
              "title": "Column Id"
            },
            "description": "Every version of the learnings an unlinked column kept."
          },
          {
            "in": "query",
            "name": "learning_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "One learning's versions, a deleted learning's included.",
              "title": "Learning Id"
            },
            "description": "One learning's versions, a deleted learning's included."
          },
          {
            "in": "query",
            "name": "saved_agent_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Every version of the learnings a saved agent kept.",
              "title": "Saved Agent Id"
            },
            "description": "Every version of the learnings a saved agent kept."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LearningVersionReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Learning not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List learning versions",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/versions/{version_id}/restore/": {
      "post": {
        "description": "Roll a learning back to one of its versions: a learning that still exists takes its words again; a deleted one comes back. Waiting drafts it reaches are written again. `dry_run` answers the learning as it would read and changes nothing. Only a signed-in person can, never an API key.",
        "operationId": "restore_learning_version",
        "parameters": [
          {
            "in": "path",
            "name": "version_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Version Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentLearningReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Version not found"
          },
          "409": {
            "description": "The learning changed meanwhile, or its list is full."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Restore a learning version",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/{learning_id}/": {
      "delete": {
        "description": "Delete one learning: the agent stops following it from its next output. The thumbs down that taught it stays in its history. Only a signed-in person can, never an API key.",
        "operationId": "delete_agent_learning",
        "parameters": [
          {
            "in": "path",
            "name": "learning_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Learning Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Learning not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a learning",
        "tags": [
          "agent-learnings"
        ]
      },
      "patch": {
        "description": "Rewrite one learning by hand. Only a signed-in person can, never an API key.",
        "operationId": "update_agent_learning",
        "parameters": [
          {
            "in": "path",
            "name": "learning_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Learning Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentLearningUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentLearningReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Learning not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rewrite a learning",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-learnings/{learning_id}/move/": {
      "post": {
        "description": "Move a saved learning to every sequence, or to one sequence only. A learning naming one step loses the step's name as it moves to every sequence. Only a signed-in person can, never an API key.",
        "operationId": "move_agent_learning",
        "parameters": [
          {
            "in": "path",
            "name": "learning_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Learning Id",
              "type": "string"
            }
          },
          {
            "description": "Check the move and answer the learning as it would read, moving nothing. A learning keeps its own id when it moves.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Check the move and answer the learning as it would read, moving nothing. A learning keeps its own id when it moves.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentLearningMoveSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentLearningReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Learning not found"
          },
          "409": {
            "description": "The list it moves to is full, or it changed meanwhile."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Move a learning",
        "tags": [
          "agent-learnings"
        ]
      }
    },
    "/agent-sending/": {
      "get": {
        "description": "Whether this workspace has paused the replies the agent sends without anyone reading them first, and whether Oneprofile has paused them for every workspace. While either is on, the agent's replies wait in Needs approval.",
        "operationId": "get_agent_sending",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentSendingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read whether the agent's own sending is paused",
        "tags": [
          "outbound-agents"
        ]
      },
      "patch": {
        "description": "Pausing holds every reply the agent would send on its own for a person to approve; writing carries on. Any signed-in person may pause; only an admin may resume. Not available to API keys, the assistant or MCP clients: this is a kill switch, and a person throws it.",
        "operationId": "set_agent_sending",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentSendingUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentSendingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Asked through the assistant, or a member asked to resume."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Pause or resume the agent's own sending",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/agent-training/sample-rows/preview/": {
      "post": {
        "description": "The first rows a table would feed the agent as examples, resolved through the same reader the Preview uses, so a value that shows blank here is a value that would have run blank. Read-only: no Preview, no runs, no credits.",
        "operationId": "preview_training_table_rows",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingTablePreviewRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingTablePreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent or table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Show the examples a table would give",
        "tags": [
          "agent-training"
        ]
      }
    },
    "/agent-training/sample-rows/suggestions/": {
      "get": {
        "description": "Examples to fill the Preview with, so the author is not asked to invent test data for an agent they have not run. Real values are read from one of the org's own tables when a table's columns can feed every input; otherwise they are written by a model from the agent's prompt and the workspace's business context, so a key that can only read is refused. The set the agent remembers (saved with `PUT /table-enrichments/saved-agents/{saved_agent_id}/sample-rows/`) is offered again until `regenerate` is sent or the agent's inputs change. Stores nothing: no Preview, no runs, no credits.",
        "operationId": "suggest_training_sample_rows",
        "parameters": [
          {
            "description": "The library agent the examples are for.",
            "in": "query",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "description": "The library agent the examples are for.",
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          },
          {
            "description": "How many examples to offer.",
            "in": "query",
            "name": "count",
            "required": false,
            "schema": {
              "default": 5,
              "description": "How many examples to offer.",
              "maximum": 25,
              "minimum": 1,
              "title": "Count",
              "type": "integer"
            }
          },
          {
            "description": "Skip the agent's remembered examples and find fresh ones; nothing stored changes until the set is saved on the agent. What 'Suggest different examples' asks for; the default replays the saved set so previewing the same agent twice offers the same examples.",
            "in": "query",
            "name": "regenerate",
            "required": false,
            "schema": {
              "default": false,
              "description": "Skip the agent's remembered examples and find fresh ones; nothing stored changes until the set is saved on the agent. What 'Suggest different examples' asks for; the default replays the saved set so previewing the same agent twice offers the same examples.",
              "title": "Regenerate",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SampleRowsResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "The model asked to write the rows did not answer."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest examples to preview",
        "tags": [
          "agent-training"
        ]
      }
    },
    "/agent-training/sessions/": {
      "get": {
        "description": "Previews, newest first. Filtered to one agent and to `live`, it is the agent's one open Preview, so opening the Preview picks up where it was left; the list is empty when the agent has none open.",
        "operationId": "list_training_sessions",
        "parameters": [
          {
            "in": "query",
            "name": "saved_agent_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only this agent's Previews.",
              "title": "Saved Agent Id"
            },
            "description": "Only this agent's Previews."
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/TrainingSessionStatusFilter"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only Previews in this status. `live` is the open Preview: running or reviewing."
            },
            "description": "Only Previews in this status. `live` is the open Preview: running or reviewing."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAt",
              "default": "created_at",
              "enum": [
                "id",
                "created_at",
                "updated_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TrainingSessionReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List Previews",
        "tags": [
          "agent-training"
        ]
      },
      "post": {
        "description": "Pin a set of examples (read from a table or typed by hand) and run the agent on all of them. The Preview is remembered: reviewing it and rating its examples resume where they were left. Close it with `complete` (Done), then open another to choose other examples.",
        "operationId": "start_training_session",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingSessionCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingSessionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "409": {
            "description": "The agent has an open Preview, or this one is closed or still running"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Open a Preview",
        "tags": [
          "agent-training"
        ]
      }
    },
    "/agent-training/sessions/{session_id}/abandon/": {
      "post": {
        "description": "Throw the Preview away, freeing the agent for a fresh one. The examples and verdicts stay as history. Idempotent.",
        "operationId": "abandon_training_session",
        "parameters": [
          {
            "in": "path",
            "name": "session_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Session Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingSessionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Preview not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Discard a Preview",
        "tags": [
          "agent-training"
        ]
      }
    },
    "/agent-training/sessions/{session_id}/complete/": {
      "post": {
        "description": "Close the Preview as finished, keeping its examples and verdicts as history. Idempotent.",
        "operationId": "complete_training_session",
        "parameters": [
          {
            "in": "path",
            "name": "session_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Session Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingSessionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Preview not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Close a Preview",
        "tags": [
          "agent-training"
        ]
      }
    },
    "/agent-training/sessions/{session_id}/rows/{row_id}/feedback/": {
      "put": {
        "description": "Record a Looks good on one example's output, or withdraw it with a null verdict. Needs work is not given here: it is a thumbs down with a reason (`POST /agent-learnings/thumbs-downs/` with `kind: agent_preview`), from which the agent learns and which runs the example again, so a `bad` verdict is refused.",
        "operationId": "save_training_feedback",
        "parameters": [
          {
            "in": "path",
            "name": "session_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Session Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "row_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Row Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingFeedbackUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingSessionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Preview or example not found"
          },
          "409": {
            "description": "The agent has an open Preview, or this one is closed or still running"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Mark an example Looks good",
        "tags": [
          "agent-training"
        ]
      }
    },
    "/ai-apps/": {
      "get": {
        "description": "The AI apps (Claude, ChatGPT, Claude Code and others) people have connected to this workspace through Oneprofile's MCP server: which app, who connected it, whether it may make changes, and when it was last used.",
        "operationId": "list_ai_apps",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAt",
              "default": "created_at",
              "enum": [
                "id",
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AiAppReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List connected AI apps",
        "tags": [
          "ai_apps"
        ]
      }
    },
    "/ai-apps/requests/{request_id}/": {
      "get": {
        "description": "What the consent page shows: the app asking to connect, where the person returns afterwards, and the workspaces they may connect it to. Only the signed-in person may read it.",
        "operationId": "get_ai_app_request",
        "parameters": [
          {
            "in": "path",
            "name": "request_id",
            "required": true,
            "schema": {
              "maxLength": 64,
              "minLength": 1,
              "title": "Request Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiAppRequestReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Asked through an AI, not a person."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The request expired or was answered."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Workspaces could not be read."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read an AI app's request to connect",
        "tags": [
          "ai_apps"
        ]
      }
    },
    "/ai-apps/requests/{request_id}/approve/": {
      "post": {
        "description": "The person's yes on the consent page: connects the app to the workspace they picked, with the access they chose, and answers where to send them back to the app. Connecting the same app to the same workspace again replaces the earlier connection. With dry_run, every check runs and the request keeps waiting; the address carries a placeholder where the code would be.",
        "operationId": "approve_ai_app_request",
        "parameters": [
          {
            "in": "path",
            "name": "request_id",
            "required": true,
            "schema": {
              "maxLength": 64,
              "minLength": 1,
              "title": "Request Id",
              "type": "string"
            }
          },
          {
            "description": "Run every check and answer as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Run every check and answer as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiAppApproveSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiAppAnswerSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Asked through an AI, not a person."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The request expired or was answered."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Workspaces could not be read."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Connect an AI app",
        "tags": [
          "ai_apps"
        ]
      }
    },
    "/ai-apps/requests/{request_id}/reject/": {
      "post": {
        "description": "The person's no on the consent page: nothing is connected, and the answer says where to send them back to the app. With dry_run, the request keeps waiting.",
        "operationId": "reject_ai_app_request",
        "parameters": [
          {
            "in": "path",
            "name": "request_id",
            "required": true,
            "schema": {
              "maxLength": 64,
              "minLength": 1,
              "title": "Request Id",
              "type": "string"
            }
          },
          {
            "description": "Run every check and answer as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Run every check and answer as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiAppAnswerSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Asked through an AI, not a person."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The request expired or was answered."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Turn down an AI app",
        "tags": [
          "ai_apps"
        ]
      }
    },
    "/ai-apps/{ai_app_id}/": {
      "delete": {
        "description": "Disconnect an AI app from this workspace: its sign-in stops working at once, and the app has to be connected again to use Oneprofile. You can disconnect your own apps; a workspace admin can disconnect anybody's.",
        "operationId": "disconnect_ai_app",
        "parameters": [
          {
            "in": "path",
            "name": "ai_app_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Ai App Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be disconnected, and disconnect nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be disconnected, and disconnect nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Somebody else's app, and not an admin."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such connected app."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Disconnect an AI app",
        "tags": [
          "ai_apps"
        ]
      }
    },
    "/ai-context/": {
      "get": {
        "description": "Get the organization's AI business context: company description, ideal customer profile, buyer personas, interest signals, social proof, voice, company type and who it sells to, with the page the description came from. Creates an empty record on first read. Includes the latest generation run so a reloaded page can resume polling one that is still running, and whether a first run from the signed-in user's address would start (`first_run_available`).",
        "operationId": "get_ai_context",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the AI context",
        "tags": [
          "ai-context"
        ]
      },
      "patch": {
        "description": "Edit the AI business context fields. Omitted fields are left untouched; a field set to null is cleared.",
        "operationId": "update_ai_context",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiContextUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update the AI context",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/documents/": {
      "get": {
        "description": "List the reference documents attached to the organization's business context, oldest first. Poll this while any document's status is `processing`; reading one takes roughly 10-60 seconds. How many a workspace may keep, and how much of their summaries a prompt reads, are on GET /ai-context/.",
        "operationId": "list_ai_context_documents",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AiContextDocumentReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the reference documents",
        "tags": [
          "ai-context"
        ]
      },
      "post": {
        "description": "Attach a file to the organization's business context. The file is read in the background and summarized; only that summary is added to AI prompts, never the file itself. Accepts PDF, Word, PowerPoint, text, markdown and CSV files.",
        "operationId": "upload_ai_context_document",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_upload_ai_context_document"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextDocumentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The file type is not supported, or the workspace is full."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Upload a reference document",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/documents/bulk/": {
      "post": {
        "description": "Attach files the signed-in user picked in the Google Picker. Each is fetched with that user's own drive.file grant, read in the background and summarized. A file that is already linked is returned as its existing document.",
        "operationId": "link_ai_context_documents_from_drive",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiContextDriveLinkRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextDocumentBulkCreateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Drive is not connected, a file cannot be reached, or the workspace is full."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "Google rejected the token refresh; the grant is gone."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Link reference documents from Google Drive",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/documents/{document_id}/": {
      "delete": {
        "description": "Remove a document from the business context and delete its stored file. A document linked from Google Drive is only unlinked; the file stays in Drive.",
        "operationId": "delete_ai_context_document",
        "parameters": [
          {
            "in": "path",
            "name": "document_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Document Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Document not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a reference document",
        "tags": [
          "ai-context"
        ]
      },
      "get": {
        "description": "Read one reference document's current state and summary.",
        "operationId": "get_ai_context_document",
        "parameters": [
          {
            "in": "path",
            "name": "document_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Document Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextDocumentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Document not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a reference document",
        "tags": [
          "ai-context"
        ]
      },
      "patch": {
        "description": "Rename a document, rewrite its summary by hand, or take it in or out of the business context. Omitted fields are left untouched.",
        "operationId": "update_ai_context_document",
        "parameters": [
          {
            "in": "path",
            "name": "document_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Document Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiContextDocumentUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextDocumentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Document not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a reference document",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/documents/{document_id}/download/": {
      "get": {
        "description": "The only way a reference document's bytes leave private storage, and it is authenticated. Takes the document's ID, never a storage key.",
        "operationId": "download_ai_context_document",
        "parameters": [
          {
            "in": "path",
            "name": "document_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Document Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {}
            },
            "description": "The file."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Document not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Download a reference document",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/documents/{document_id}/summary/regenerate/": {
      "post": {
        "description": "Write the document's summary again from the text already read out of it. Does not re-read the file. Replaces a summary that was edited by hand.",
        "operationId": "summarize_ai_context_document",
        "parameters": [
          {
            "in": "path",
            "name": "document_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Document Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextDocumentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Document not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The document is already being read, or was never read."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rewrite a reference document's summary",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/documents/{document_id}/sync/": {
      "post": {
        "description": "Re-read a linked file if it changed in Drive since it was last read. An unchanged file costs one metadata call and returns the document as it is.",
        "operationId": "refresh_ai_context_document",
        "parameters": [
          {
            "in": "path",
            "name": "document_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Document Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextDocumentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Document not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Not a Drive document, already being read, Drive not connected, or the file cannot be reached."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "Google rejected the token refresh; the grant is gone."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Refresh a reference document from Google Drive",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/qa/": {
      "get": {
        "description": "List the workspace's Q&A: questions contacts ask that the workspace answered once, each kept for one sequence's agent (`sequence_id`, `sequence_name`) or for every sequence (`sequence_id` null). The latest answered first. Each reply's prompt reads the newest answers that fit `max_qa_context_chars`, its sequence's own winning a question both answer; the ones past it report `in_prompt: false`. How many questions a workspace may keep, how much of them a prompt reads and how long a question and an answer may be are on GET /ai-context/.",
        "operationId": "list_ai_context_qa",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AiContextQaEntrySchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the Q&A",
        "tags": [
          "ai-context"
        ]
      },
      "post": {
        "description": "Answer a question once for every reply one sequence's agent writes (`sequence_id`), or every sequence's (null, the default). A question the Q&A already answers in that scope, whatever its case or closing punctuation, is the same question: the same answer again only rewords it, and a different answer changes it, which only a workspace admin can do (never with an API key).",
        "operationId": "create_ai_context_qa_entry",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiContextQaCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextQaEntrySchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "description": "Only a workspace admin can change or delete a Q&A answer, and never with an API key."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The sequence was not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The Q&A holds as many answers as it may (`qa_limit_reached`), or the question or answer has no words (`qa_entry_blank`)."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Add an answer to the Q&A",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/qa/{entry_id}/": {
      "delete": {
        "description": "Remove one answer from the Q&A: no reply the agents write states it again, and a question card asks the question afresh. Only a workspace admin can, and never with an API key.",
        "operationId": "delete_ai_context_qa_entry",
        "parameters": [
          {
            "in": "path",
            "name": "entry_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Entry Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "description": "Only a workspace admin can change or delete a Q&A answer, and never with an API key."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Answer not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a Q&A answer",
        "tags": [
          "ai-context"
        ]
      },
      "patch": {
        "description": "Reword a Q&A question, change its answer, or move it to one sequence's agent (`sequence_id`) or every sequence's (null); omitted fields are left untouched. The answer it replaces is kept as `previous_answer`. Only a workspace admin can, and never with an API key.",
        "operationId": "update_ai_context_qa_entry",
        "parameters": [
          {
            "in": "path",
            "name": "entry_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Entry Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiContextQaUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextQaEntrySchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "description": "Only a workspace admin can change or delete a Q&A answer, and never with an API key."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The answer, or the sequence it is moved to, was not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The question now reads as one the Q&A already answers in its scope (`qa_question_taken`), or the question or answer has no words (`qa_entry_blank`)."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change a Q&A answer",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/runs/": {
      "post": {
        "description": "Research a company domain in the background and write the AI business context from the result. Answers 202 with the run to poll; a run takes up to about 3 minutes. Only one run can go at a time per organization.\n\nSend a `domain` to overwrite every field with what it says. Send none and the run reads the company domain in the signed-in user's email address and fills only the fields still empty when it lands, so anything typed meanwhile survives: that is a new workspace's first-run start, and it is refused (422, `domain_required`) when the address is consumer webmail, when any context field already has text in it, when a run has been made before, or when the signed-in user is not the person who created the organization. `GET /ai-context/` says whether it would start (`first_run_available`), so a screen asks only when it would.",
        "operationId": "generate_ai_context",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AiContextGenerateRequestSchema"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextGenerationJobReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "No company domain can be read from `domain`, a run is already going, or no domain was sent and none can be read from the signed-in user's address."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Write the AI context from a company domain",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/ai-context/runs/{run_id}/": {
      "get": {
        "description": "Poll a generation run until its status is terminal. On success the AI context record has already been overwritten with the generated fields.",
        "operationId": "get_ai_context_generation_job",
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiContextGenerationJobReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Run not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a generation run",
        "tags": [
          "ai-context"
        ]
      }
    },
    "/api-keys/": {
      "get": {
        "description": "List all API keys for the user. Requires a user authentication (not API key).",
        "operationId": "list_api_keys",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtName",
              "default": "id",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_APIKeyReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List API keys",
        "tags": [
          "apikey"
        ]
      },
      "post": {
        "description": "Create a new API key for the user. Requires a user authentication (not API key).\n\nThe response carries the key's value, and it is the only time it is ever shown: only a hash of it is stored. Keys that can write are part of every paid plan; a workspace on the free plan can create read-only keys.\n\nA key never does more than the person who makes it may do: a workspace admin's key acts as an admin, a member's key acts as a member.",
        "operationId": "create_api_key",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/APIKeyCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/APIKeyCreatedSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "An API key with the generated key already exists, or the workspace's plan does not allow the scope asked for."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create an API key",
        "tags": [
          "apikey"
        ]
      }
    },
    "/api-keys/length/": {
      "get": {
        "description": "Get the number of API keys for the organization.",
        "operationId": "count_api_keys",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/APIKeyCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the number of API keys",
        "tags": [
          "apikey"
        ]
      }
    },
    "/api-keys/scopes/": {
      "get": {
        "description": "What a new key in this workspace may be allowed to do. A workspace on a paid plan can create read or write keys; the free plan can create read keys.",
        "operationId": "list_api_key_scopes",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_APIKeyScopeReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the API key scopes this workspace may create",
        "tags": [
          "apikey"
        ]
      }
    },
    "/api-keys/{api_key_id}/": {
      "delete": {
        "description": "Delete an API key by its ID. Requires a user authentication (not API key). You can delete the keys you made; a workspace admin can delete anybody's.",
        "operationId": "delete_api_key",
        "parameters": [
          {
            "in": "path",
            "name": "api_key_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Api Key Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "A key somebody else made, and not an admin."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The API key was not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete an API key",
        "tags": [
          "apikey"
        ]
      },
      "get": {
        "description": "Get an API key by its ID. Requires a user authentication (not API key).",
        "operationId": "get_api_key",
        "parameters": [
          {
            "in": "path",
            "name": "api_key_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Api Key Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/APIKeyReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The API key was not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get an API key",
        "tags": [
          "apikey"
        ]
      },
      "patch": {
        "description": "Update an API key by its ID. Requires a user authentication (not API key). You can change the keys you made; a workspace admin can change anybody's.",
        "operationId": "update_api_key",
        "parameters": [
          {
            "in": "path",
            "name": "api_key_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Api Key Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/APIKeyUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/APIKeyReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "A key somebody else made, and not an admin."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The API key was not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update an API key",
        "tags": [
          "apikey"
        ]
      }
    },
    "/app-listings/connections/{connection_id}/claim/": {
      "post": {
        "description": "Re-authorize an existing integration in place from a switch/reconnect OAuth grant. The target integration and intent are read from the pending connection (bound server-side from the OAuth state), so the grant can only re-authorize the integration it was started for. Preserves every sync, schedule, mapping, alert, and history row on the connection. With dry_run, the connection and the integration are checked and left as they are; the new grant is not tried against the vendor.",
        "operationId": "claim_onto_existing",
        "parameters": [
          {
            "in": "path",
            "name": "connection_id",
            "required": true,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "title": "Connection Id",
              "type": "string"
            }
          },
          {
            "description": "Check the claim and answer as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Check the claim and answer as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppListingClaimOntoExistingResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Pending connection or target not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Finalize a switch/reconnect onto an existing integration",
        "tags": [
          "app-listings"
        ]
      }
    },
    "/app-listings/connections/{connection_id}/config/": {
      "get": {
        "description": "Return the tenant/region/login config the engine captured for a pending OAuth connection (e.g. Salesforce login_url), so the create wizard can show the customer (read-only) the workspace they linked. Empty for one-click listings.",
        "operationId": "get_connection_config",
        "parameters": [
          {
            "in": "path",
            "name": "connection_id",
            "required": true,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "title": "Connection Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppListingConnectionConfigResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Pending connection not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a pending connection's captured connect-time config",
        "tags": [
          "app-listings"
        ]
      }
    },
    "/app-listings/{slug}/authorize/": {
      "post": {
        "description": "Return the provider OAuth authorize URL for connecting an app listing.",
        "operationId": "install",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "title": "Slug",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppListingInstallRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppListingInstallResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "App listing not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Start an app listing OAuth install",
        "tags": [
          "app-listings"
        ]
      }
    },
    "/app-listings/{slug}/callback/": {
      "post": {
        "description": "Validate the OAuth callback for the app listing and return a pending-connection id. A sign-in that was started for another app listing is refused.",
        "operationId": "callback",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "title": "Slug",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppListingCallbackRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppListingCallbackResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "App listing not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Exchange an app listing OAuth callback",
        "tags": [
          "app-listings"
        ]
      }
    },
    "/app-listings/{slug}/check/": {
      "post": {
        "description": "Confirm a customer's hand-typed workspace/tenant resolves before redirecting to the vendor login. Returns found, not_found, or unreachable.",
        "operationId": "preflight",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "title": "Slug",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppListingPreflightRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppListingPreflightResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "App listing not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Check a workspace resolves before connecting",
        "tags": [
          "app-listings"
        ]
      }
    },
    "/app-listings/{slug}/connect-inputs/": {
      "get": {
        "description": "Return the per-customer inputs (tenant address, region, or a choice) the connect modal collects before the OAuth redirect. Empty for one-click listings.",
        "operationId": "list_connect_inputs",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "title": "Slug",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ConnectInputSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "App listing not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an app listing's connect-time inputs",
        "tags": [
          "app-listings"
        ]
      }
    },
    "/assistant/actions/": {
      "get": {
        "description": "Every action the AI Assistant proposed or applied in one chat conversation, newest first (`order_direction=asc` for the order it made them), whatever became of each: proposed, applied, dismissed or failed. Or, by table, the actions still waiting on someone whose arguments name that table, newest first: the cards a table's own page shows, including the one a scheduled search raises with no conversation behind it. Each card quotes the price the operation carried when it was proposed, in credits, and names who decided it.",
        "operationId": "list_workspace_actions",
        "parameters": [
          {
            "description": "The chat conversation whose actions to list.",
            "in": "query",
            "name": "conversation_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The chat conversation whose actions to list.",
              "title": "Conversation Id"
            }
          },
          {
            "description": "The table whose waiting actions to list.",
            "in": "query",
            "name": "table_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The table whose waiting actions to list.",
              "title": "Table Id"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForProposedAt",
              "default": "proposed_at",
              "enum": [
                "proposed_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ActionProposalReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Conversation not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the AI Assistant's proposed and applied actions",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/actions/bulk/approve/": {
      "post": {
        "description": "Apply several proposals at once: the cards one AI Assistant reply raised, decided together. Each is applied on its own, so one that cannot run comes back `failed` with its reason while the rest still apply, and a card already decided comes back unchanged rather than as an error.\n\n`scope` means the same thing it does on a single approval and is applied to every card named. `updated` counts the cards that were waiting.\n\nWith `dry_run`, answers the cards as approving them would leave them and applies, allows and charges nothing.",
        "operationId": "approve_workspace_actions",
        "parameters": [
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActionApproveBatchSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActionApproveBatchResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such action."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Approve every action one reply proposed",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/actions/{proposal_id}/": {
      "get": {
        "description": "One card by id: what a notification links to. A scheduled search's card has no conversation, so this is the only way to reach it by the link.",
        "operationId": "get_workspace_action",
        "parameters": [
          {
            "in": "path",
            "name": "proposal_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Proposal Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActionProposalReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Proposal not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read one proposed or applied action",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/actions/{proposal_id}/approve/": {
      "post": {
        "description": "Apply a proposal on your say-so. Idempotent: approving an action that already applied returns it unchanged, so a second click applies nothing twice. An action whose apply is refused (the balance is empty, or cannot cover what has to be paid before it starts; the object it names is gone) comes back `failed` with the reason on the card, not as an error. A run charged as it fills may start when the most it could cost is more than the balance: it stops when the credits run out and keeps what it filled.\n\n`scope` says whether the next one like it should still ask: `once` decides this card alone, `thread` allows the operation for the rest of the conversation, `project_me` allows it for you across the workspace and `project_all` for everybody in it. A send is never grantable and asks again whatever is chosen.\n\nWith `dry_run`, answers the card as approving it would leave it and applies, allows and charges nothing; what only the apply can learn (the result, a refusal from the action itself) is not in the answer.",
        "operationId": "approve_workspace_action",
        "parameters": [
          {
            "in": "path",
            "name": "proposal_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Proposal Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ActionApproveSchema"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActionProposalReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Proposal not found."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActionConflictResponseSchema"
                }
              }
            },
            "description": "The proposal is not in a state this decision applies to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Approve a proposed action",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/actions/{proposal_id}/reject/": {
      "post": {
        "description": "Decline a proposal. Nothing runs, and the card records who said no. With `dry_run`, answers the card as declining it would leave it and changes nothing.",
        "operationId": "reject_workspace_action",
        "parameters": [
          {
            "in": "path",
            "name": "proposal_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Proposal Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActionProposalReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Proposal not found."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActionConflictResponseSchema"
                }
              }
            },
            "description": "The proposal is not in a state this decision applies to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Reject a proposed action",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/conversations/": {
      "get": {
        "description": "List your own general chat conversations with the AI Assistant: pinned first, then most recently active first (`order_direction=asc` for the least recent). A conversation with no messages yet is left out, and so is one you deleted. Pass `made_table_id` to find the conversation whose action created that table. Private to the person who started them: nobody else in the workspace sees them.",
        "operationId": "list_workspace_chat_conversations",
        "parameters": [
          {
            "in": "query",
            "name": "made_table_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only your own conversation whose action created this table. The list is empty when the table was not made in a conversation, when a colleague made it (conversations are private to whoever started them), or when that conversation has been deleted.",
              "title": "Made Table Id"
            },
            "description": "Only your own conversation whose action created this table. The list is empty when the table was not made in a conversation, when a colleague made it (conversations are private to whoever started them), or when that conversation has been deleted."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForLastMessageAt",
              "default": "last_message_at",
              "enum": [
                "last_message_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_WorkspaceChatConversationReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List AI Assistant chat conversations",
        "tags": [
          "assistant"
        ]
      },
      "post": {
        "description": "Start an empty conversation. Create it before the first message so the conversation exists for the whole of that turn; it takes its title from the first message.",
        "operationId": "create_workspace_chat_conversation",
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceChatConversationReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Start an AI Assistant chat conversation",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/conversations/{conversation_id}/grants/": {
      "get": {
        "description": "What this chat conversation applies without asking, as it stands now: the write operations the AI Assistant runs unasked here (approving a card for this conversation adds one) and the verbs, and whether that list is the workspace defaults (read live, so a change in Settings reaches it) or the conversation's own, frozen the first time it allowed something. Anything on the list still asks when it is priced at or above the spend threshold, and a send always asks.",
        "operationId": "get_conversation_grants",
        "parameters": [
          {
            "in": "path",
            "name": "conversation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Conversation Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConversationGrantsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Conversation not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read what a conversation may apply without asking",
        "tags": [
          "workspace-actions"
        ]
      },
      "patch": {
        "description": "Change the conversation's grant list. Take one operation back by sending `granted_tools` without it, or one verb by sending `granted_verbs` without it; a field left out keeps its half as it was. Send `granted_verbs` as null to follow the workspace defaults again, operations included. An empty list allows nothing and still stops following the defaults. A verb that always asks (pushing to a destination) cannot be granted and is refused.",
        "operationId": "update_conversation_grants",
        "parameters": [
          {
            "in": "path",
            "name": "conversation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Conversation Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConversationGrantsUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConversationGrantsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Conversation not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change what a conversation may apply without asking",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/conversations/{conversation_id}/messages/": {
      "get": {
        "description": "List a conversation's messages in the order they happened (`order_direction=desc` for the latest first, which is where a reopened conversation and a client checking whether its turn landed both look), each reply with the trail it showed and the action cards it raised, as they stand now. A reply whose `status` is `pending` is a turn still running: its content is the words written so far, up to a second behind, and its trail the steps taken so far. A turn whose process died before that is shown `failed` once its time is up.",
        "operationId": "list_workspace_chat_messages",
        "parameters": [
          {
            "in": "path",
            "name": "conversation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Conversation Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForSequence",
              "default": "sequence",
              "enum": [
                "sequence"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_WorkspaceChatMessageReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Conversation not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List AI Assistant chat messages",
        "tags": [
          "assistant"
        ]
      },
      "post": {
        "description": "Run one turn and answer when it is done: the fallback for a client that cannot open the streaming route. The AI Assistant answers questions about the workspace and the product, and takes the eight workspace actions when asked: each lands as a card under the reply, applied when the workspace's rules allow it and proposed for approval otherwise. A request that needs a table's rows or a search it cannot run is answered with where to ask it.\n\nA turn that breaks still answers 201, with the reply's `status` set to `failed`: an error status would roll back the row that records it. A refused turn (the workspace's allowance is spent, or the AI Assistant is paused) answers 429 and writes nothing. A message naming a file that is not yours, or was already sent, answers 422 and writes nothing.",
        "operationId": "send_workspace_chat_message",
        "parameters": [
          {
            "in": "path",
            "name": "conversation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Conversation Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkspaceChatMessageCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceChatTurnResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Conversation not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceChatUnavailableResponseSchema"
                }
              }
            },
            "description": "The workspace's allowance is spent, or the AI Assistant is paused"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Ask the AI Assistant",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/conversations/{conversation_id}/messages/stream/": {
      "post": {
        "description": "Run one turn and stream it as Server-Sent Events: a `plan` frame whenever the AI Assistant publishes or ticks its plan, a `step` frame for each thing the AI Assistant actually did (read_context when the workspace has a business context, then plan, then write_column, retry_column and price_column for a column the message described, then one apply_action per action it applied), one `turn` frame naming the saved user message's sequence once it is saved (the Stop route is addressed by it), `delta` frames carrying the whole reply so far (assign, never append), a `said` frame when a later round of the turn starts writing (the words the reply showed until then, now a step: put `step` at `at` among the steps sent and empty the reply, which the next `delta` fills), then exactly one `result` frame with the same body the non-streaming route returns, the reply carrying its action cards, sent once the reply is saved. The last `delta` always equals the saved reply.\n\nA turn that could not run ends in one `error` frame whose `reason` is `limit`, `paused` or `not_found`; a message naming a file that is not yours or was already sent ends in an `error` frame with no reason and nothing saved; any other failure is an `error` frame with no reason. A turn that breaks while running still ends in a `result` whose reply carries `failed`, and so does a stopped one, its reply reading `Stopped by you`.\n\nClosing the connection does not cancel the turn: it finishes and saves its reply, so reopening the conversation shows the answer.",
        "operationId": "stream_workspace_chat_message",
        "parameters": [
          {
            "in": "path",
            "name": "conversation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Conversation Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkspaceChatMessageCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceChatTurnResponseSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of Server-Sent Events. The final `result` frame's `data` is a turn; an `error` frame's `data` is a stream error."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Ask the AI Assistant, streaming its work",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/conversations/{conversation_id}/messages/{sequence}/resume/stream/": {
      "post": {
        "description": "Continue the turn whose reply sits at `sequence` and is `waiting`, once every card it raised has been approved or declined. Streams the same frames as sending a message: `delta` frames carrying the whole reply so far, a `said` frame when a later round starts writing, then one `result`, or another `approval` if the turn goes on to ask for something else.\n\nEnds in an `error` frame with reason `not_found` when there is no waiting turn at that position, one with reason `resumed` when another run is already carrying it on (a second tab, or the AI Assistant picking it up itself a few seconds after its last card was decided where no chat carried it on), and an `error` frame with no reason while any of its cards is still undecided. Costs nothing against the workspace's allowance: the turn was claimed when it started.",
        "operationId": "resume_workspace_chat_message",
        "parameters": [
          {
            "in": "path",
            "name": "conversation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Conversation Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "sequence",
            "required": true,
            "schema": {
              "title": "Sequence",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceChatTurnResponseSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of Server-Sent Events, ending in one `result`, `approval` or `error` frame."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Resume an AI Assistant turn waiting on your approval",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/conversations/{conversation_id}/messages/{sequence}/stop/": {
      "post": {
        "description": "Ask the turn whose user message sits at `sequence` (the streaming route's `turn` frame names it) to stop at its next check. The turn stops before its model call, or within a second while the model writes, and lands as a `result` whose reply carries `failed` and reads `Stopped by you`; the workspace's allowance is not charged for it. Idempotent, and harmless once the turn has landed: a Stop nobody is listening for expires on its own.",
        "operationId": "stop_workspace_chat_message",
        "parameters": [
          {
            "in": "path",
            "name": "conversation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Conversation Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "sequence",
            "required": true,
            "schema": {
              "title": "Sequence",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkspaceChatStopResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Conversation not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stop an AI Assistant chat turn",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/my-grants/": {
      "get": {
        "description": "The write operations you, and only you, have allowed the AI Assistant to run without asking in this workspace: \"Approve for you, in every conversation\" on an action card adds one. Each holds in every conversation of yours here, whatever the conversation or the workspace allows, until you take it back. Listed by the name the operation has today, the first allowed first; one that no longer allows anything is not listed. Anything priced at or above the spend threshold still asks, and a send always asks. A signed-in person only: an API key has no person to allow anything for. The whole list comes back in one page.",
        "operationId": "list_my_assistant_grants",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_MyGrantReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List what the AI Assistant does without asking you",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/my-grants/{tool}/": {
      "delete": {
        "description": "Stop the AI Assistant running one operation unasked for you: from now on it puts up a card first, unless the conversation or the workspace allows it for everybody. Name the operation as `GET /assistant/my-grants/` lists it; a grant kept under a name it used to have goes too. Only your own grants are touched. `count` is 0 when you had not allowed it, so a second call is harmless. With `dry_run`, answers the same and takes nothing back.",
        "operationId": "delete_my_assistant_grant",
        "parameters": [
          {
            "description": "The operation, by the name `GET /assistant/my-grants/` lists it under.",
            "in": "path",
            "name": "tool",
            "required": true,
            "schema": {
              "description": "The operation, by the name `GET /assistant/my-grants/` lists it under.",
              "maxLength": 255,
              "minLength": 1,
              "title": "Tool",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Take back something you allowed the AI Assistant to do without asking you",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/prompts/": {
      "get": {
        "description": "Every prompt this workspace is offered, built-in ones first, then its own oldest first. A workspace saves a few dozen at most, so the whole list comes back in one page.",
        "operationId": "list_assistant_prompts",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AssistantPromptReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the saved prompts",
        "tags": [
          "assistant-prompt"
        ]
      },
      "post": {
        "operationId": "save_assistant_prompt",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantPromptCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantPromptReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The workspace has saved as many prompts as it may."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Save a prompt",
        "tags": [
          "assistant-prompt"
        ]
      }
    },
    "/assistant/prompts/{prompt_id}/": {
      "delete": {
        "operationId": "delete_assistant_prompt",
        "parameters": [
          {
            "in": "path",
            "name": "prompt_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Prompt Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such prompt."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a saved prompt",
        "tags": [
          "assistant-prompt"
        ]
      },
      "patch": {
        "operationId": "update_assistant_prompt",
        "parameters": [
          {
            "in": "path",
            "name": "prompt_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Prompt Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantPromptUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantPromptReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such prompt."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rewrite a saved prompt",
        "tags": [
          "assistant-prompt"
        ]
      }
    },
    "/assistant/settings/": {
      "get": {
        "description": "The workspace's rules for what the AI Assistant may apply without asking: the credit threshold at or above which every action proposes, the verbs a new conversation may apply on its own, and the write operations it may call without asking. Created with the defaults on first read.",
        "operationId": "get_assistant_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantSettingsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read the AI Assistant's action settings",
        "tags": [
          "workspace-actions"
        ]
      },
      "patch": {
        "description": "Set the threshold, the default grants, or any of them. A verb that always asks (pushing to a destination) cannot be granted and is refused. The verb list and the operation list are independent: changing one leaves the other exactly as it was.",
        "operationId": "update_assistant_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantSettingsUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantSettingsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change the AI Assistant's action settings",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/assistant/threads/": {
      "get": {
        "description": "List your threads across every assistant (a table's, a lead search's, an agent's, the general chat's) in one list: pinned first, then most recently active first (`order_direction=asc` for the least recent). Your own threads, plus the workspace's shared legacy table threads that nobody is recorded as starting. Deleted threads are left out.\n\nPaged by an opaque cursor rather than an offset: the page after a cursor starts after that row's place in the order, so a thread pinned or deleted between two requests never shifts the next page.",
        "operationId": "list_assistant_threads",
        "parameters": [
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only threads whose title or message text contains this, case-insensitively.",
              "title": "Search"
            },
            "description": "Only threads whose title or message text contains this, case-insensitively."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForLastMessageAt",
              "default": "last_message_at",
              "enum": [
                "last_message_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AssistantThreadReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List AI Assistant threads",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/threads/{thread_id}/": {
      "delete": {
        "description": "Delete a thread: hidden from the list now, purged from its store thirty days later. A table thread's pending column suggestions and a chat thread's actions still waiting for approval are dismissed with it; anything already accepted or applied is untouched. A thread that is not yours answers 404. With `dry_run`, answers as the delete would and deletes nothing.",
        "operationId": "delete_assistant_thread",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Thread not found, or not the caller's"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete an AI Assistant thread",
        "tags": [
          "assistant"
        ]
      },
      "patch": {
        "description": "Rename a thread, pin or unpin it, or both. The rename is kept beside the store's own title, so the list shows it and the store keeps naming the thread after its first message. A thread that is not yours answers 404, the same as one that does not exist.",
        "operationId": "update_assistant_thread",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantThreadUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantThreadReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Thread not found, or not the caller's"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rename or pin an AI Assistant thread",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/threads/{thread_id}/link/": {
      "post": {
        "description": "Record that this thread continues in another: the lead search that produced a table, and the table's thread it carried on in. Written on both ends, so each thread's row shows the link. Both threads must be yours; either one that is not answers 404.",
        "operationId": "link_assistant_thread",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssistantThreadLinkSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantThreadLinkResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Thread not found, or not the caller's"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Link an AI Assistant thread to the one it continues in",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/tools/": {
      "get": {
        "description": "Every tool the AI Assistant may use on your behalf: what it does, which part of the product it belongs to, whether using it changes anything, and whether your workspace may allow it to run without asking. The writes are the ones the settings page can allow; the reads are listed so you can see what it is able to look at. The whole toolset comes back in one page.",
        "operationId": "list_assistant_tools",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ToolReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List what the AI Assistant can do",
        "tags": [
          "assistant"
        ]
      }
    },
    "/assistant/verbs/": {
      "get": {
        "description": "The eight verbs, with their labels and the one static rule: whether the verb always asks first.",
        "operationId": "list_workspace_verbs",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_VerbReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the actions the AI Assistant can take",
        "tags": [
          "workspace-actions"
        ]
      }
    },
    "/attribution/signup-source/": {
      "put": {
        "description": "Record the marketing page or campaign the caller's workspace signed up from: the `src` tag and the `utm_source`, `utm_medium` and `utm_campaign` values the register link carried. The app sends it once, right after signup. First touch wins: a workspace keeps the first source recorded for it, and one that is no longer registering records nothing. Neither is an error; both report `recorded: false`. Requires a signed-in user rather than an API key: a signup has a person behind it.",
        "operationId": "claim_signup_source",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SignupSourceClaimRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignupSourceClaimReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Workspace not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Record where a new workspace came from",
        "tags": [
          "attribution"
        ]
      }
    },
    "/attribution/signup/": {
      "put": {
        "description": "Record that the signed-in person has signed up, so the team hears about it once. The app sends it right after signup. A person is announced at most once, and only within 24 hours of creating their account; anything else reports `recorded: false`. Requires a signed-in user rather than an API key: a signup has a person behind it.",
        "operationId": "record_signup",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignupRecordReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "User not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Announce the caller's signup",
        "tags": [
          "attribution"
        ]
      }
    },
    "/billing/checkout-sessions/": {
      "post": {
        "description": "Start a one-time credit pack purchase via Stripe Checkout. Only available on paid plans; the amount must be within the configured minimum and the remaining monthly purchase limit. Only a workspace admin can buy credits.",
        "operationId": "start_credit_pack_checkout",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreditPackCheckoutRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditPackCheckoutResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Not a workspace admin."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid credit pack purchase request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Start a credit pack purchase",
        "tags": [
          "billing"
        ]
      }
    },
    "/billing/credit-packs/quote/": {
      "get": {
        "description": "Get the one-time credit pack pricing, presets, and remaining monthly purchase limit. Pass ?credits= to price a specific amount.",
        "operationId": "get_credit_pack_quote",
        "parameters": [
          {
            "description": "Credit amount to price.",
            "in": "query",
            "name": "credits",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maximum": 100000000,
                  "minimum": 1,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Credit amount to price.",
              "title": "Credits"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditPackQuoteReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get credit pack quote",
        "tags": [
          "billing"
        ]
      }
    },
    "/billing/credit-prices/": {
      "get": {
        "description": "The unit price of each billable operation, in credits, plus the dollar value of a credit. Code-defined and identical for every organization: this is what the plan page's usage calculator quotes from.",
        "operationId": "list_credit_prices",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditPricesReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List published credit prices",
        "tags": [
          "billing"
        ]
      }
    },
    "/billing/portal-sessions/": {
      "post": {
        "description": "Create a billing portal session to manage payment methods and invoices, and to cancel the subscription. This API is only available for paid plans. If you call this API for a free plan, you will get a validation error. Only a workspace admin, or an API key an admin made, can open it.",
        "operationId": "create_billing_portal_session",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/BillingPortalRequestSchema"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Request"
              }
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillingPortalResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Not a workspace admin."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create billing portal session",
        "tags": [
          "billing"
        ]
      }
    },
    "/billing/products/": {
      "get": {
        "description": "List all available billing products with their pricing information.",
        "operationId": "list_products",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ProductReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List available products",
        "tags": [
          "billing"
        ]
      }
    },
    "/billing/subscription/": {
      "get": {
        "description": "Get the subscription information for the organization.",
        "operationId": "get_subscription",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubscriptionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get subscription information",
        "tags": [
          "billing"
        ]
      }
    },
    "/billing/subscription/switch-plan/": {
      "post": {
        "description": "Switch the organization to a new subscription plan, credit volume, or billing interval. Returns the Stripe URL to send the customer to: hosted Checkout for a first paid subscription, or the billing portal's confirmation flow for a change to an existing one, where Stripe shows the proration and takes the confirmation. Pass `dry_run=true` to run the same checks and see which of the two the switch would open, without opening it: the answer then carries no URL. Only a workspace admin can switch the plan; anybody in the workspace can ask the dry run.",
        "operationId": "switch_plan",
        "parameters": [
          {
            "description": "Report which Stripe page the switch would open, and open nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report which Stripe page the switch would open, and open nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchPlanRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SwitchPlanRedirectResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Not a workspace admin."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid plan switch request"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Switch subscription plan",
        "tags": [
          "billing"
        ]
      }
    },
    "/billing/transactions/": {
      "get": {
        "description": "List the organization's Stripe invoices, newest first: subscription invoices and one-time credit pack invoices. Empty for organizations that never had a Stripe customer. Pages forward only, so a page has a next cursor and never a previous one.",
        "operationId": "list_transactions",
        "parameters": [
          {
            "description": "Set the cursor to the next page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 1024,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_InvoiceReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List billing transactions",
        "tags": [
          "billing"
        ]
      }
    },
    "/chat-attachments/": {
      "post": {
        "description": "Upload a CSV, Excel or PDF file to send with your next message to the AI Assistant. The file is read once here: a spreadsheet's column names and row count, or a PDF's page count, come back for the card in the composer, and the assistant reads the file when the message is sent. Name the file's `id` in the message's `attachment_ids`; a file never sent can be removed again.\n\nFiles up to 10 MB, and PDFs up to 500 pages with text to read (a scan has none). The format is decided by the file's own bytes, not its name.",
        "operationId": "upload_chat_attachment",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_upload_chat_attachment"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChatAttachmentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Add a file to send with an AI Assistant message",
        "tags": [
          "assistant"
        ]
      }
    },
    "/chat-attachments/{attachment_id}/": {
      "delete": {
        "description": "Remove a file you added and have not sent: the X on its card in the composer. A file already sent with a message stays with that message and is not found here.",
        "operationId": "delete_chat_attachment",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be removed, and remove nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be removed, and remove nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "File not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Remove a file added to an AI Assistant message before it was sent",
        "tags": [
          "assistant"
        ]
      },
      "get": {
        "description": "Read what a file you attached is, as its card in the composer shows it: its name, its kind (`spreadsheet` or `pdf`), its size, a spreadsheet's columns and row count or a PDF's page count, and whether it was sent. Its contents are read through its rows or, for a PDF, its pages. Only your own files.",
        "operationId": "read_chat_attachment",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChatAttachmentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "File not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read a file attached to an AI Assistant message",
        "tags": [
          "assistant"
        ]
      }
    },
    "/chat-attachments/{attachment_id}/columns/{source_index}/distribution/": {
      "get": {
        "description": "Count one column of your attached CSV or XLSX file, or of the table a PDF you attached holds. Counts cover every nonblank data row in its sheet, with the top 20 values, percentages of all rows, empty and distinct counts, other_count and the column's name. source_index is zero-based, counted as a page of the file's rows shows its columns; `sheet` reads another workbook sheet, and `header_row` names the row holding the column names under a title. The raw values are read a page at a time from the column's values.",
        "operationId": "read_chat_attachment_column_distribution",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "source_index",
            "required": true,
            "schema": {
              "title": "Source Index",
              "type": "integer"
            }
          },
          {
            "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
            "in": "query",
            "name": "sheet",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
              "title": "Sheet"
            }
          },
          {
            "description": "The row holding the column names under a title, numbered as a page of the file's rows numbers them; the column is named from it and counted over the rows below. 0 keeps the first row.",
            "in": "query",
            "name": "header_row",
            "required": false,
            "schema": {
              "default": 0,
              "description": "The row holding the column names under a title, numbered as a page of the file's rows numbers them; the column is named from it and counted over the rows below. 0 keeps the first row.",
              "minimum": 0,
              "title": "Header Row",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileColumnDistributionSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Column or source not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read an attached file column's value distribution",
        "tags": [
          "assistant"
        ]
      }
    },
    "/chat-attachments/{attachment_id}/columns/{source_index}/values/": {
      "get": {
        "description": "List the raw values of one column of your attached CSV or XLSX file, or of the table a PDF you attached holds: in file order, without coercion, each with the data row it is in, `limit` at a time. source_index is zero-based, counted as a page of the file's rows shows its columns; `sheet` reads another workbook sheet, and `header_row` names the row holding the column names under a title. How the values are spread is the column's distribution.",
        "operationId": "read_chat_attachment_column_values",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "source_index",
            "required": true,
            "schema": {
              "title": "Source Index",
              "type": "integer"
            }
          },
          {
            "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
            "in": "query",
            "name": "sheet",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
              "title": "Sheet"
            }
          },
          {
            "description": "The row holding the column names under a title, numbered as a page of the file's rows numbers them; the column is named from it and counted over the rows below. 0 keeps the first row.",
            "in": "query",
            "name": "header_row",
            "required": false,
            "schema": {
              "default": 0,
              "description": "The row holding the column names under a title, numbered as a page of the file's rows numbers them; the column is named from it and counted over the rows below. 0 keeps the first row.",
              "minimum": 0,
              "title": "Header Row",
              "type": "integer"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNumber",
              "default": "number",
              "enum": [
                "number"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ChatAttachmentColumnValueReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Column or source not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an attached file column's raw values",
        "tags": [
          "assistant"
        ]
      }
    },
    "/chat-attachments/{attachment_id}/comments/": {
      "get": {
        "description": "The cell comments a sheet carries on no data row (the header's, a title's above it, one under the list), in the file's order: what a reader of the rows needs beside them. A row's own comments come on the row, from `GET \u2026/rows/`. Empty for a CSV or a PDF. For a workbook, `sheet` reads another sheet. Only your own files.",
        "operationId": "list_chat_attachment_comments",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          },
          {
            "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
            "in": "query",
            "name": "sheet",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
              "title": "Sheet"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ChatAttachmentCommentReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "File not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the comments on no data row of a file attached to an AI Assistant message",
        "tags": [
          "assistant"
        ]
      }
    },
    "/chat-attachments/{attachment_id}/import/": {
      "post": {
        "description": "Create a table from a file attached to a message, every column of the file becoming a column of the table with a type read off its values, and start adding the file's rows to it in the background. Takes any size of file the plan's row limit allows, so it is the way to turn a whole lead list into a table. A PDF becomes the table its pages hold, its columns named as the PDF names them. When the file's first row is a title, `header_row` names the row that holds the column names, and `row_ranges` picks rows numbered as a page of the file's rows shows them. The table exists when this returns; poll the import job to follow the rows arriving. Only your own files.",
        "operationId": "import_chat_attachment_as_table",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChatAttachmentImportRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChatAttachmentImportResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Plan table limit reached. Upgrade to create more tables."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "File not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Build a table from a file attached to an AI Assistant message",
        "tags": [
          "assistant"
        ]
      }
    },
    "/chat-attachments/{attachment_id}/pages/": {
      "get": {
        "description": "Read some of a PDF's pages as text, each laid out as the page prints it: a table's columns stay side by side and each of its rows stays one line, with the gaps between columns cut to three spaces. `limit` is the most pages to read; a read also stops at a size, so read on with `next_page_cursor`. The PDF's name and page count are on the file's own read. A spreadsheet has rows instead of pages. Only your own files.",
        "operationId": "read_chat_attachment_pages",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNumber",
              "default": "number",
              "enum": [
                "number"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ChatAttachmentPageReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "File not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read pages of a PDF attached to an AI Assistant message",
        "tags": [
          "assistant"
        ]
      }
    },
    "/chat-attachments/{attachment_id}/rows/": {
      "get": {
        "description": "Read one page of a file's rows as text, one cell per column, each row with the cell comments on it. `limit` is the most rows to read; a page also stops at a size, so page on with `next_page_cursor`. For a workbook, `sheet` reads another sheet. The sheet's column names, its whole row count and the workbook's other sheets come with the count of its rows. A PDF's rows are the table its pages hold: the first read of them reads the table off its pages, which takes a few seconds a page, and is refused when the PDF holds no table or more than one. Only your own files: a file someone else attached is not found.",
        "operationId": "read_chat_attachment_rows",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          },
          {
            "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
            "in": "query",
            "name": "sheet",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
              "title": "Sheet"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNumber",
              "default": "number",
              "enum": [
                "number"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ChatAttachmentRowReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "File not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read rows of a file attached to an AI Assistant message",
        "tags": [
          "assistant"
        ]
      }
    },
    "/chat-attachments/{attachment_id}/rows/length/": {
      "get": {
        "description": "Count a file's rows, read as a page of its rows reads them, with what a reader needs beside them: the sheet's column names, the sheet read and the workbook's other sheets, whether the first row is only a title over the column names, and what reading the sheet had to do. The cell comments on no data row are read through `GET \u2026/comments/`. For a workbook, `sheet` counts another sheet. A PDF's rows are the table its pages hold, read off its pages the first time any are asked for. Only your own files.",
        "operationId": "count_chat_attachment_rows",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          },
          {
            "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
            "in": "query",
            "name": "sheet",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A workbook sheet by name, matched without case when no sheet has exactly that name; omit for the attached sheet.",
              "title": "Sheet"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChatAttachmentRowsCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "File not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count the rows of a file attached to an AI Assistant message",
        "tags": [
          "assistant"
        ]
      }
    },
    "/column-templates/": {
      "get": {
        "description": "The organisation's saved multi-column templates, newest first.",
        "operationId": "list_column_templates",
        "parameters": [
          {
            "in": "query",
            "name": "name__contains",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Case-insensitive name fragment.",
              "title": "Name  Contains"
            },
            "description": "Case-insensitive name fragment."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtName",
              "default": "created_at",
              "enum": [
                "id",
                "created_at",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ColumnTemplateReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List column templates",
        "tags": [
          "table-templates"
        ]
      },
      "post": {
        "description": "Snapshot a selection of a table's columns (definitions, settings and the display names their references carry) as a named, org-level template replayable on any table.",
        "operationId": "create_column_template",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ColumnTemplateCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColumnTemplateReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or column not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Capture a multi-column template",
        "tags": [
          "table-templates"
        ]
      }
    },
    "/column-templates/{template_id}/": {
      "delete": {
        "description": "Delete a saved template. Columns already created from it are untouched: a template is a snapshot of how to build them, not a link to them.",
        "operationId": "delete_column_template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Template not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a column template",
        "tags": [
          "table-templates"
        ]
      }
    },
    "/column-templates/{template_id}/apply/": {
      "post": {
        "description": "Create the template's columns on a table, left to right, as one block at the requested position (appended when omitted), references remapped: template-internal references land on their new counterparts, external ones on the target's same-named columns, and anything unmatched stays visibly broken rather than silently wrong. All or nothing: a column the table refuses undoes the ones created before it. Nothing runs. The created columns wait to be run deliberately. Answers the names of the columns it created. With dry_run it drafts each column against the table and the ones before it, refuses what the apply would refuse, answers the names it would create and creates none.",
        "operationId": "apply_column_template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          },
          {
            "description": "Report which columns would be created, and create none.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report which columns would be created, and create none.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ColumnTemplateApplySchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColumnTemplateApplyResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Template or table not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Apply a template to a table",
        "tags": [
          "table-templates"
        ]
      }
    },
    "/cooldown/settings/": {
      "get": {
        "operationId": "get_cooldown_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CooldownSettingsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read the workspace's cooldown rules",
        "tags": [
          "contact_cooldown"
        ]
      },
      "patch": {
        "description": "The dial can be left off. Off is where every existing workspace starts. Turning it off or shortening it lets go on the contacts it stopped that it no longer would, where they stood.",
        "operationId": "update_cooldown_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CooldownSettingsUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CooldownSettingsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update the workspace's cooldown rules",
        "tags": [
          "contact_cooldown"
        ]
      }
    },
    "/credits/ledger/": {
      "get": {
        "description": "The raw immutable ledger (detailed retention window only), newest first by default.",
        "operationId": "list_credit_ledger",
        "parameters": [
          {
            "in": "query",
            "name": "entry_kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/CreditEntryKind"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Entry Kind"
            }
          },
          {
            "description": "Only entries of any of these kinds. Repeat the parameter for each kind. Use this rather than several requests when a surface shows a mix ('where did my credits come from', say, which wants every kind except usage charges).",
            "in": "query",
            "name": "entry_kind__in",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/CreditEntryKind"
                  },
                  "maxItems": 20,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only entries of any of these kinds. Repeat the parameter for each kind. Use this rather than several requests when a surface shows a mix ('where did my credits come from', say, which wants every kind except usage charges).",
              "title": "Entry Kind  In"
            }
          },
          {
            "in": "query",
            "name": "start_time",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Start Time"
            }
          },
          {
            "in": "query",
            "name": "end_time",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "End Time"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdOccurredAtCreatedAtUpdatedAt",
              "default": "occurred_at",
              "enum": [
                "id",
                "occurred_at",
                "created_at",
                "updated_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_CreditLedgerEntrySchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List credit ledger entries",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/summary/": {
      "get": {
        "description": "The global credit meter: available balance, period allowance, refill date, and the low/blocked flags. Cheap to poll; lazily creates the balance with the plan's initial grant on first access.",
        "operationId": "get_credit_summary",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditBalanceSummarySchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the credit balance summary",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/balance-timeseries/": {
      "get": {
        "description": "Get the balance series for the usage overview chart.",
        "operationId": "get_balance_timeseries",
        "parameters": [
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "interval",
            "required": false,
            "schema": {
              "default": "day",
              "enum": [
                "hour",
                "day"
              ],
              "title": "Interval",
              "type": "string"
            }
          },
          {
            "description": "IANA timezone for buckets",
            "in": "query",
            "name": "timezone",
            "required": false,
            "schema": {
              "default": "UTC",
              "description": "IANA timezone for buckets",
              "title": "Timezone",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditBalanceTimeseriesResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the balance-over-time series",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-agent/": {
      "get": {
        "description": "What each saved agent spent in the range, dearest first, each with the columns it runs as nested under it, paged by cursor. Only the detailed retention window names an agent; spend no agent is named for is counted as unattributed. How many agents there are and the range's totals are `GET /credits/usage/by-agent/length/`.",
        "operationId": "list_usage_by_agent",
        "parameters": [
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreditsSpent",
              "default": "credits_spent",
              "enum": [
                "credits_spent"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_CreditAttributionEntitySchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List credit spend attributed to saved agents",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-agent/length/": {
      "get": {
        "description": "How many agents `GET /credits/usage/by-agent/` pages through for the range, with the range's totals: what the whole workspace spent and had refunded, and what no agent is named for.",
        "operationId": "count_usage_by_agent",
        "parameters": [
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditAttributionCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count the saved agents that spent credits",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-provider/": {
      "get": {
        "description": "Get the provider/account attribution report.",
        "operationId": "get_usage_by_provider",
        "parameters": [
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditAttributionResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get credit spend attributed to providers and accounts",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-table/": {
      "get": {
        "description": "What each table spent in the range, dearest first, each with its columns' spend nested under it, paged by cursor. Spend no table is named for is one row with a null `id`. A table that is gone keeps its row, marked `deleted`. How many rows there are and the range's totals are `GET /credits/usage/by-table/length/`.",
        "operationId": "list_usage_by_table",
        "parameters": [
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreditsSpent",
              "default": "credits_spent",
              "enum": [
                "credits_spent"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_CreditAttributionEntitySchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List credit spend attributed to tables and columns",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-table/length/": {
      "get": {
        "description": "How many rows `GET /credits/usage/by-table/` pages through for the range, with the range's totals: what the whole workspace spent and had refunded, what no table is named for, and from when the column rows cover the range.",
        "operationId": "count_usage_by_table",
        "parameters": [
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditAttributionCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count the tables that spent credits",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-table/{table_id}/by-column/": {
      "get": {
        "description": "Get one table's per-column usage.",
        "operationId": "get_table_usage_by_column",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditTableUsageByColumnResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get one table's per-column credit usage",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-table/{table_id}/by-run/": {
      "get": {
        "description": "What each run of one table spent in the range, the newest first charge first, paged by cursor. The charges no run made are one row with a null `run_id`. Only the detailed retention window has runs, so a range reaching further back is read from where that window starts. How many runs there are and what all of them spent together is `GET \u2026/by-run/length/`.",
        "operationId": "list_table_usage_by_run",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForFirstChargeAt",
              "default": "first_charge_at",
              "enum": [
                "first_charge_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_CreditRunUsageSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List one table's per-run credit usage",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-table/{table_id}/by-run/length/": {
      "get": {
        "description": "How many runs of one table spent credits in the range, the rows `GET \u2026/by-run/` pages through, and what every one of them spent together: the table's total for the range, read from the same detailed retention window.",
        "operationId": "count_table_usage_by_run",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditTableRunsCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count one table's runs that spent credits",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/by-table/{table_id}/timeseries/": {
      "get": {
        "description": "Get one table's spend series for the per-table usage dialog.",
        "operationId": "get_table_spend_timeseries",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "interval",
            "required": false,
            "schema": {
              "default": "day",
              "enum": [
                "hour",
                "day"
              ],
              "title": "Interval",
              "type": "string"
            }
          },
          {
            "description": "IANA timezone for buckets",
            "in": "query",
            "name": "timezone",
            "required": false,
            "schema": {
              "default": "UTC",
              "description": "IANA timezone for buckets",
              "title": "Timezone",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditSpendTimeseriesResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get one table's spend series",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/export/": {
      "get": {
        "description": "One endpoint serves every report; filters mirror the source endpoints. Streams synchronously; the ledger export reads in keyset batches.",
        "operationId": "export_credit_usage",
        "parameters": [
          {
            "in": "query",
            "name": "report",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/CreditExportReport"
            }
          },
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "interval",
            "required": false,
            "schema": {
              "default": "day",
              "enum": [
                "hour",
                "day"
              ],
              "title": "Interval",
              "type": "string"
            }
          },
          {
            "description": "IANA timezone for buckets",
            "in": "query",
            "name": "timezone",
            "required": false,
            "schema": {
              "default": "UTC",
              "description": "IANA timezone for buckets",
              "title": "Timezone",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "table_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Table Id"
            }
          },
          {
            "in": "query",
            "name": "entry_kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/CreditEntryKind"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Entry Kind"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/csv": {}
            },
            "description": "The report as a CSV file."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Export a usage report as CSV",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/meta/": {
      "get": {
        "description": "Where usage history starts and the boundary before which data is served from monthly rollups.",
        "operationId": "get_credit_usage_meta",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditUsageMetaSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get usage history boundaries",
        "tags": [
          "credits"
        ]
      }
    },
    "/credits/usage/spend-timeseries/": {
      "get": {
        "description": "Get the spend series for the usage overview chart.",
        "operationId": "get_spend_timeseries",
        "parameters": [
          {
            "description": "Range start (ISO 8601)",
            "in": "query",
            "name": "start_time",
            "required": true,
            "schema": {
              "description": "Range start (ISO 8601)",
              "format": "date-time",
              "title": "Start Time",
              "type": "string"
            }
          },
          {
            "description": "Range end (ISO 8601)",
            "in": "query",
            "name": "end_time",
            "required": true,
            "schema": {
              "description": "Range end (ISO 8601)",
              "format": "date-time",
              "title": "End Time",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "interval",
            "required": false,
            "schema": {
              "default": "day",
              "enum": [
                "hour",
                "day"
              ],
              "title": "Interval",
              "type": "string"
            }
          },
          {
            "description": "IANA timezone for buckets",
            "in": "query",
            "name": "timezone",
            "required": false,
            "schema": {
              "default": "UTC",
              "description": "IANA timezone for buckets",
              "title": "Timezone",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreditSpendTimeseriesResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the credits-spent series",
        "tags": [
          "credits"
        ]
      }
    },
    "/design-partner/feedback/": {
      "get": {
        "description": "Everything this workspace has told us, newest first. The whole organization sees every member's submissions: the page is addressed to the organization, and a partner should be able to read what a colleague already asked for instead of asking again.",
        "operationId": "list_design_partner_feedback",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAt",
              "default": "created_at",
              "enum": [
                "id",
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_DesignPartnerFeedbackReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the workspace's design partner feedback",
        "tags": [
          "design-partner"
        ]
      },
      "post": {
        "description": "Record one submission from the caller. Any member of a design partner workspace may submit. Requires a signed-in user rather than an API key: the record is of who said this, and an API key has no person behind it.",
        "operationId": "submit_design_partner_feedback",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DesignPartnerFeedbackCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DesignPartnerFeedbackReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Send design partner feedback",
        "tags": [
          "design-partner"
        ]
      }
    },
    "/design-partner/slack-channel/invite/": {
      "post": {
        "description": "Send the workspace's invitation to the address in the body. With no channel yet this starts the run that creates one and sends the invitation from inside it, and answers `provisioning` for the page to poll; with a channel ready the invitation goes out immediately.\n\nA workspace gets one invitation to its channel, so a second call while the first is still live is a 409 rather than a second email. Nothing here happens on a page load: the address is required, so a call without a body is a 422.\n\nA refusal Slack itself made, their Slack being on a free plan for instance, is not an error: it comes back in the body with a sentence to show them.",
        "operationId": "invite_to_design_partner_slack_channel",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DesignPartnerSlackInviteCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DesignPartnerSlackReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found"
          },
          "409": {
            "description": "The invitation cannot be sent as things stand."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Send the workspace's shared Slack channel invite",
        "tags": [
          "design-partner"
        ]
      }
    },
    "/design-partner/status/": {
      "get": {
        "description": "The probe the dashboard uses to decide whether the design partner page exists for this workspace, plus everything that page needs above the fold. Answers 200 with `is_design_partner: false` rather than a 404 so an ordinary session never logs an auth failure for a page it was never offered.",
        "operationId": "get_design_partner_status",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DesignPartnerStatusReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Is this workspace a design partner?",
        "tags": [
          "design-partner"
        ]
      }
    },
    "/do-not-contact/": {
      "delete": {
        "description": "Removal is deliberate and manual-only; no automated path unsuppresses. A contact an entry a person added stopped before any step reached them goes on from step one, as a new contact would; one already reached stays as it is, and so does everyone an unsubscribe, a bounce or an inbox Do not contact put on the list. Ids that are no longer on the list are skipped, and `count` says how many went.",
        "operationId": "delete_do_not_contact",
        "parameters": [
          {
            "description": "IDs of the entries to delete",
            "in": "query",
            "name": "ids",
            "required": true,
            "schema": {
              "description": "IDs of the entries to delete",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "minItems": 1,
              "title": "Ids",
              "type": "array"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete do-not-contact entries",
        "tags": [
          "suppression"
        ]
      },
      "get": {
        "description": "Newest first unless `order_by` says otherwise: `created_at` orders by when each entry was added, `value` by the address or domain. Ties go by id. `GET /do-not-contact/length/` counts the same filters.",
        "operationId": "list_do_not_contact",
        "parameters": [
          {
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SuppressionKind"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only addresses, or only whole domains"
            },
            "description": "Only addresses, or only whole domains"
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 320,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by value (case-insensitive contains)",
              "title": "Search"
            },
            "description": "Filter by value (case-insensitive contains)"
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtValue",
              "default": "created_at",
              "enum": [
                "id",
                "created_at",
                "value"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SuppressionEntryReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List do-not-contact entries",
        "tags": [
          "suppression"
        ]
      }
    },
    "/do-not-contact/bulk/": {
      "post": {
        "description": "Paste or upload addresses and domains in bulk; duplicates are ignored. Answers the entries that were new, and the inputs that could not be read as an address or a domain. A reply the AI wrote for anyone they reach leaves Needs approval, never to be sent.",
        "operationId": "add_do_not_contact",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SuppressionAddSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuppressionBulkCreateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Add do-not-contact entries",
        "tags": [
          "suppression"
        ]
      }
    },
    "/do-not-contact/export/": {
      "get": {
        "description": "Plain text, one value per line, importable anywhere.",
        "operationId": "export_do_not_contact",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Plain text file, one value per line."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Export the do-not-contact list",
        "tags": [
          "suppression"
        ]
      }
    },
    "/do-not-contact/length/": {
      "get": {
        "description": "How many entries the list's filters select.",
        "operationId": "count_do_not_contact",
        "parameters": [
          {
            "description": "Filter by value (case-insensitive contains)",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 320,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by value (case-insensitive contains)",
              "title": "Search"
            }
          },
          {
            "description": "Only addresses, or only whole domains",
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SuppressionKind"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only addresses, or only whole domains",
              "title": "Kind"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuppressionCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count do-not-contact entries",
        "tags": [
          "suppression"
        ]
      }
    },
    "/google-drive/connection/": {
      "delete": {
        "description": "Drop the signed-in user's grant. Documents already linked keep their summaries; adding more and refreshing stop working until reconnected.",
        "operationId": "disconnect_google_drive",
        "parameters": [
          {
            "description": "Report what would be disconnected, and disconnect nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be disconnected, and disconnect nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Disconnect Google Drive",
        "tags": [
          "google-drive"
        ]
      },
      "get": {
        "description": "Whether the signed-in user has connected Google Drive in this workspace. The grant is per user: drive.file reaches only the files that person picked.",
        "operationId": "get_google_drive_connection",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GoogleDriveConnectionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the Google Drive connection",
        "tags": [
          "google-drive"
        ]
      }
    },
    "/google-drive/connection/authorize/": {
      "post": {
        "description": "Returns the Google authorize URL; the org and user ride in the OAuth state.",
        "operationId": "start_google_drive_connect",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GoogleDriveConnectStartResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "No Drive client is set up."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Begin connecting Google Drive",
        "tags": [
          "google-drive"
        ]
      }
    },
    "/google-drive/connection/callback/": {
      "post": {
        "description": "Exchanges the OAuth code and stores the grant for the signed-in user.",
        "operationId": "google_drive_connect_callback",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleDriveConnectCallbackSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GoogleDriveConnectionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The OAuth state is invalid or expired."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "Google rejected the token exchange."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Finish connecting Google Drive",
        "tags": [
          "google-drive"
        ]
      }
    },
    "/google-drive/connection/picker-token/": {
      "get": {
        "description": "A short-lived access token, scoped to drive.file, for the browser to render the Google Picker with, plus the app id and developer key the Picker needs. Mint one per open; never cache it.",
        "operationId": "mint_google_drive_picker_token",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DrivePickerTokenReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Drive is not connected."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "Google rejected the token refresh; the grant is gone."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Mint a Google Picker token",
        "tags": [
          "google-drive"
        ]
      }
    },
    "/inbox/attachments/{attachment_id}/download/": {
      "get": {
        "description": "The only way attachment bytes leave the private bucket, authenticated.",
        "operationId": "download_attachment",
        "parameters": [
          {
            "in": "path",
            "name": "attachment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Attachment Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {}
            },
            "description": "The file."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Download an attachment",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/drafts/": {
      "get": {
        "description": "AI replies, newest first. Narrow to one conversation with `thread_id`, and to the ones that still wait for a person with `status=pending_approval`: that is the draft a conversation shows for approval. Without `status` every draft comes back, the rejected, stale and sent ones too.",
        "operationId": "list_inbox_drafts",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/AiDraftStatus"
                  },
                  "maxItems": 8,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only drafts in any of these states, repeated for several. `pending_approval` is a reply waiting for a person.",
              "title": "Status"
            },
            "description": "Only drafts in any of these states, repeated for several. `pending_approval` is a reply waiting for a person."
          },
          {
            "in": "query",
            "name": "thread_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the drafts of this conversation",
              "title": "Thread Id"
            },
            "description": "Only the drafts of this conversation"
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForId",
              "default": "id",
              "enum": [
                "id"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AiDraftReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List reply drafts",
        "tags": [
          "inbox-ai"
        ]
      },
      "post": {
        "description": "Write a reply to the conversation's latest message for a person to approve. The conversation's sequence's agent writes it, exactly as it would answer on its own, and the reply waits for a person. A conversation outside every sequence has no agent, and is refused with 409. `steer_text` is a one-line instruction for this reply. Refused with 409 at once when the agent may not write it now (it is already writing this reply, for instance), the detail saying why, and when nothing usable was written, rather than answered with filler.",
        "operationId": "generate_draft",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiDraftCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiDraftReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The conversation is outside every sequence, so no agent writes its replies; or its sequence has no audience table, so its agent has nothing to write from; or the agent may not write it now (already writing this reply, writing paused, its spending limit, not enough credits, the reply rejected or already sent), and the detail says why; or nothing usable was written, so there is no draft this time."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Generate a reply draft",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/drafts/stream/": {
      "post": {
        "description": "Draft with AI as a stream of Server-Sent Events. Writes exactly the reply the plain draft route writes, and says what it did on the way: a `step` frame for each piece of work once it is done (reading the conversation, reading the contact's LinkedIn profile when the conversation's agent does, writing the reply), each with its measured duration, then one `result` frame whose `data` is the draft, or null when nothing usable was written.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `not_found` when the conversation is gone, and no reason for anything else, including a conversation outside every sequence, a sequence with no audience table and a reply the agent may not write now (already writing it, writing paused, no credits), whose sentences say so.\n\nClosing the connection does not stop the draft: it is still written and saved.",
        "operationId": "stream_generate_draft",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiDraftCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/AiDraftReadSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of Server-Sent Events; the final `result` frame's `data` is the draft, or null."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Generate a reply draft, streaming the work",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/drafts/{draft_id}/": {
      "patch": {
        "description": "Change the words that will be sent. What the agent wrote is kept for comparison. The edit is kept; a learning is proposed from it by `POST /agent-learnings/hand-edits/`, saved when the reply is sent. A reply an older release scheduled is edited as one waiting, and waits for a person to approve it. Refused once the reply is sending or settled.",
        "operationId": "edit_draft",
        "parameters": [
          {
            "in": "path",
            "name": "draft_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Draft Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EditDraftSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiDraftReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "This reply is already sending or settled, so it can no longer change."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Edit a draft before approving it",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/drafts/{draft_id}/approve/": {
      "post": {
        "description": "Send a reply because a person approved it. It goes out the way the message it answers came in: by email from the mailbox that email reached, or on LinkedIn from the conversation's account (see the draft's `channel` and `mailbox_id`); a reply written before that was recorded leaves the way the conversation does. It is recorded as sent by that person. Only a reply waiting for approval can be approved. Two people approving it at once send it once: the first approval sends it, and the second is refused with 409, saying it is already being sent or was sent. A reply that answers an older message while the contact's newer one waits (being read, or read as their own words) is refused with 409 and stays waiting; an away notice or an auto-reply after it does not hold it. A reply whose message was answered already, from the mailbox, LinkedIn or here, is refused with 409 and no longer waits. A reply to a contact on the do-not-contact list is refused with 409 and stays waiting. Sent with `as_written_only`, as Approve and send over many conversations does, a reply whose words or subject were changed is refused with 409 and stays waiting. A reply edited while its approval was deciding is refused with 409 and stays waiting, in its newer words. A reply an older release scheduled is approved as one waiting. Approving it saves the learning its Needs work proposed, unless its list is full: `saved_learnings` says whether it did. With `rev`, it saves the reply's feedback session only as the page showed it. With `dry_run` it makes every check the send makes and answers the draft as it would stand once sent, sending nothing.",
        "operationId": "approve_draft",
        "parameters": [
          {
            "in": "path",
            "name": "draft_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Draft Id",
              "type": "string"
            }
          },
          {
            "description": "Report the draft as it would stand once sent, and send nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report the draft as it would stand once sent, and send nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApproveDraftSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiDraftApprovalReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "This reply is not waiting for approval, another send is already sending it or sent it, the contact wrote again after the message it answers, that message was answered already, its contact is on the do-not-contact list, or its words were changed and it was approved as written only, it was edited while this approval decided, or its feedback session moved on since the `rev` sent."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "424": {
            "description": "The mailbox or LinkedIn account this reply goes out from cannot send, or it answers by email a contact with no email address."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "The mailbox would not send this reply. The reply still waits."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Approve and send a draft",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/drafts/{draft_id}/feedback/": {
      "put": {
        "description": "Record the human verdict (good or bad) against the draft, replacing an earlier one. Accepted in any status: judging a draft after approving or rejecting it is exactly when the verdict is clearest. On a reply a sequence's agent wrote only `good` (Looks good) is a rating, and it saves no learning: `bad` is refused with 422, because what is wrong with its words is a Needs work with a reason (`POST /agent-learnings/thumbs-downs/`, kind `reply_draft`), which saves a learning.",
        "operationId": "rate_draft",
        "parameters": [
          {
            "in": "path",
            "name": "draft_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Draft Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RateDraftSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiDraftReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "description": "A bad rating on a reply a sequence's agent wrote."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rate a draft",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/drafts/{draft_id}/regenerate/": {
      "post": {
        "description": "Write a fresh reply in place of this one, which is kept so what was written before stays comparable. Works on a reply waiting for approval and on one an older release scheduled; the new reply always waits for a person. Refused once the reply is sending or settled, including a send that failed: write a fresh reply then. Like Draft with AI, a conversation no longer in a sequence is refused, and so is a reply the agent may not write now, at once, the detail saying why. A refusal leaves this reply as it was, except when nothing usable was written: that is refused too, and this reply is retired all the same, leaving the conversation with no draft.",
        "operationId": "regenerate_draft",
        "parameters": [
          {
            "in": "path",
            "name": "draft_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Draft Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateDraftSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiDraftReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "This reply is already sending or settled, so it can no longer change; or the conversation is no longer in a sequence, so no agent writes its replies; or its sequence has no audience table, so its agent has nothing to write from; or the agent may not write it now (already writing this reply, writing paused, its spending limit, not enough credits, the reply rejected or already sent), the detail says why, and this reply stays as it was; or nothing usable was written this time, and the old reply is retired all the same."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Try again",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/drafts/{draft_id}/reject/": {
      "post": {
        "description": "Reject the reply so it is never sent, a reply an older release scheduled too; the agent does not write the same words again for that message. Refused once the reply is sending or settled. With `dry_run` it answers the draft as it would stand once rejected, and rejects nothing.",
        "operationId": "reject_draft",
        "parameters": [
          {
            "in": "path",
            "name": "draft_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Draft Id",
              "type": "string"
            }
          },
          {
            "description": "Report the draft as it would stand once rejected, and reject nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report the draft as it would stand once rejected, and reject nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiDraftReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "This reply is already sending or settled, so it can no longer change."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Reject a draft",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/events/": {
      "get": {
        "description": "Server-sent event stream of inbox changes. One coalesced event kind, `inbox_invalidated`, tells the client to refetch what it shows; `hello` on connect means the same thing. The server closes the stream after a few minutes with a `reconnect` frame. Requires Clerk authentication; API keys are rejected.",
        "operationId": "stream_inbox_events",
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/InboxInvalidatedEventSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of change events; each frame's `data` is one event."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stream the inbox's change events",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/labels/": {
      "get": {
        "description": "Alphabetical by default, each with how many conversations carry it.",
        "operationId": "list_inbox_labels",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNameId",
              "default": "name",
              "enum": [
                "name",
                "id"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LabelReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List labels",
        "tags": [
          "inbox"
        ]
      },
      "post": {
        "description": "An outcome label: what the conversation MEANT, never a folder.",
        "operationId": "create_inbox_label",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LabelCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LabelReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a label",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/labels/{label_id}/": {
      "delete": {
        "description": "Threads keep their other labels. A built-in label (`is_seeded`) is refused with 409: the AI files replies under it.",
        "operationId": "delete_inbox_label",
        "parameters": [
          {
            "in": "path",
            "name": "label_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Label Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The label is built in, so it cannot be deleted."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a label",
        "tags": [
          "inbox"
        ]
      },
      "patch": {
        "description": "Rename (seeded labels refuse, because the classifier and the positive rate resolve them by name) and/or set whether the label's threads count into the positive rate.",
        "operationId": "update_inbox_label",
        "parameters": [
          {
            "in": "path",
            "name": "label_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Label Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LabelUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LabelReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a label",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/replies-wait-notice/": {
      "get": {
        "description": "Whether the Inbox shows this person the one-time notice that every reply the agent writes now waits for a person: shown to the admins of a workspace whose replies went out on their own before, until one of them closes it.",
        "operationId": "get_replies_wait_notice",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RepliesWaitNoticeReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Whether to show the notice that replies now wait",
        "tags": [
          "inbox-ai"
        ]
      },
      "patch": {
        "description": "Close the one-time notice that replies now wait, for every admin of the workspace. Admins only (403 otherwise). Closing it again changes nothing.",
        "operationId": "dismiss_replies_wait_notice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RepliesWaitNoticeUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RepliesWaitNoticeReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "description": "Not a workspace admin."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Close the notice that replies now wait",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/saved-views/": {
      "get": {
        "description": "The workspace's named filter sets, alphabetically. `filters` carries this endpoint's own thread-list query parameter names, so applying a view means replaying them into `GET /inbox/threads/`. Keys this build does not recognise are dropped server-side, so a view is always applicable.",
        "operationId": "list_inbox_saved_views",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNameIdCreatedAtUpdatedAt",
              "default": "name",
              "enum": [
                "name",
                "id",
                "created_at",
                "updated_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SavedViewReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List saved views",
        "tags": [
          "inbox"
        ]
      },
      "post": {
        "description": "Keep a set of inbox filters under a name so a triage session starts in one click. Workspace-wide, not per-user, because a saved view is a way of working a team should be able to share.",
        "operationId": "create_inbox_saved_view",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedViewCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedViewReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Save the current filters as a view",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/saved-views/{view_id}/": {
      "delete": {
        "description": "Forgets the filters. The conversations they selected are untouched.",
        "operationId": "delete_inbox_saved_view",
        "parameters": [
          {
            "in": "path",
            "name": "view_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "View Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a saved view",
        "tags": [
          "inbox"
        ]
      },
      "patch": {
        "description": "Both fields are independent, so renaming and 'make this match what I am looking at now' are the same endpoint without either clobbering the other.",
        "operationId": "update_inbox_saved_view",
        "parameters": [
          {
            "in": "path",
            "name": "view_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "View Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedViewUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedViewReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rename a saved view or repoint its filters",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/": {
      "delete": {
        "description": "The bulk form of deleting one thread. Contacts, their enrolments and the do-not-contact list are untouched, so a new reply starts a fresh conversation. Stale ids are silently absent from the count.",
        "operationId": "bulk_delete_threads",
        "parameters": [
          {
            "description": "IDs of the threads to delete",
            "in": "query",
            "name": "ids",
            "required": true,
            "schema": {
              "description": "IDs of the threads to delete",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "minItems": 1,
              "title": "Ids",
              "type": "array"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete many threads",
        "tags": [
          "inbox"
        ]
      },
      "get": {
        "description": "Newest-first by default, unless `search` is set. Then it is ranked by relevance, most useful match first, and `sort` is ignored. `sort=longest_waiting` reads the same list from the other end, oldest activity first, which is how a reply that has been sitting unanswered for three days gets to the top. `order_direction=asc` reads whichever order is chosen the other way round. Bounces live in their own view, and away notices and auto-replies under the built-in labels Out of office and Auto-reply, which keep their conversations out of the working views like any label set to (`filtered_out`); `unlabelled` is the work queue: real threads nobody and no classifier has described yet. `search` runs full-text over every message plus the contact's name and address. `channel` and the `last_message_at__after` / `last_message_at__before` bounds narrow the list; both bounds are inclusive. The working views (`all`, `unlabelled`, `needs_approval`) list only conversations the contact wrote into: a send nobody answered is not in the inbox. `all` and `unlabelled` list only those still waiting on us: a reply with no answer yet, an unread conversation, a reminder that went off, or an answer of ours that went three business days unanswered (`came_back`, `returns_at`) when the verdict on their latest reply does not say the conversation is over. Once we answer, a conversation moves out and stays in `sent`; one marked done (`is_done`) stays out until a new message reaches us. A `search` reads every conversation the contact wrote into, waiting or not, and a `label_id` every conversation carrying the label. `needs_approval` lists a waiting draft whatever label its conversation carries. Each row's `listed_at` is the moment it sorts by. `bounces` and `reminders` list what a machine wrote or the person snoozed. `sent` lists every conversation something of ours went out in, a sequence step or a reply, on email or LinkedIn, answered or not and whatever became of it since; a LinkedIn reply still queued for the browser, or one that failed, has not gone out. A send nobody answered never lights the unread badge. Each row's `contact_replied` says whether the contact has written back. `reply_state=replied` keeps the conversations we answered after the contact's latest reply, by a person or the agent; `reply_state=not_replied` keeps the ones whose latest reply is still the last word. `all_mail` lists every conversation, whatever became of it: the place a conversation marked done is found.",
        "operationId": "list_inbox_threads",
        "parameters": [
          {
            "in": "query",
            "name": "channel",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InboxChannel"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only email, or only LinkedIn"
            },
            "description": "Only email, or only LinkedIn"
          },
          {
            "in": "query",
            "name": "label_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only conversations carrying this label",
              "title": "Label Id"
            },
            "description": "Only conversations carrying this label"
          },
          {
            "in": "query",
            "name": "last_message_at__after",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only conversations whose last message is at or after this time",
              "title": "Last Message At  After"
            },
            "description": "Only conversations whose last message is at or after this time"
          },
          {
            "in": "query",
            "name": "last_message_at__before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only conversations whose last message is at or before this time",
              "title": "Last Message At  Before"
            },
            "description": "Only conversations whose last message is at or before this time"
          },
          {
            "in": "query",
            "name": "mailbox_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only this mailbox's conversations",
              "title": "Mailbox Id"
            },
            "description": "Only this mailbox's conversations"
          },
          {
            "in": "query",
            "name": "mailbox_id__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave out these mailboxes' conversations",
              "title": "Mailbox Id  Not"
            },
            "description": "Leave out these mailboxes' conversations"
          },
          {
            "in": "query",
            "name": "reply_state",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ReplyState"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only answered, or only unanswered"
            },
            "description": "Only answered, or only unanswered"
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Full-text search over every message and the contact's name and address",
              "title": "Search"
            },
            "description": "Full-text search over every message and the contact's name and address"
          },
          {
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only this sender's conversations",
              "title": "Sender Profile Id"
            },
            "description": "Only this sender's conversations"
          },
          {
            "in": "query",
            "name": "sender_profile_id__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave out these senders' conversations",
              "title": "Sender Profile Id  Not"
            },
            "description": "Leave out these senders' conversations"
          },
          {
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only this sequence's conversations",
              "title": "Sequence Id"
            },
            "description": "Only this sequence's conversations"
          },
          {
            "in": "query",
            "name": "sequence_id__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave out these sequences' conversations",
              "title": "Sequence Id  Not"
            },
            "description": "Leave out these sequences' conversations"
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ThreadSort",
              "default": "newest",
              "description": "Newest first, longest waiting first, positive labels first, or grouped by sequence"
            },
            "description": "Newest first, longest waiting first, positive labels first, or grouped by sequence"
          },
          {
            "in": "query",
            "name": "unread_only",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only conversations nobody has read",
              "title": "Unread Only",
              "type": "boolean"
            },
            "description": "Only conversations nobody has read"
          },
          {
            "in": "query",
            "name": "view",
            "required": false,
            "schema": {
              "default": "all",
              "description": "Which reading of the inbox to list",
              "pattern": "^(all|unlabelled|needs_approval|bounces|reminders|sent|all_mail)$",
              "title": "View",
              "type": "string"
            },
            "description": "Which reading of the inbox to list"
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForListedAt",
              "default": "listed_at",
              "enum": [
                "listed_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ThreadReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List inbox threads",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/bulk/": {
      "patch": {
        "description": "The bulk form of changing one conversation's read, done and reminder marks: the same fields for every conversation in `ids`, and a mark left out stays as it is. Ids that no longer exist are silently absent from the count, because a selection can go stale under the user between choosing and clicking. A null `snoozed_until` cancels the reminder on every selected thread. With `dry_run` it says how many would change and changes none.",
        "operationId": "bulk_update_threads",
        "parameters": [
          {
            "description": "Report how many would change, and change none.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report how many would change, and change none.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ThreadBulkUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Mark many threads read, done or snoozed",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/bulk/label/": {
      "post": {
        "description": "Labels every conversation in `ids`; `updated` counts the ones that gained the label, so a conversation that already carried it is not counted. With `dry_run` it says how many would gain it and labels none.",
        "operationId": "bulk_add_label",
        "parameters": [
          {
            "description": "Report how many would be labelled, and label none.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report how many would be labelled, and label none.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkLabelUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Put one label on many threads",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/bulk/suppress/": {
      "post": {
        "description": "The bulk form of do-not-contact on one thread: every selected contact suppressed, every cadence stopped, every selected conversation marked done. `updated` counts the conversations acted on, `stopped` the live enrolments that stopped, and `sequence_names` the sequences they were in. With `dry_run` it answers the same and changes nothing, which is how a confirm dialog names them first.",
        "operationId": "bulk_do_not_contact",
        "parameters": [
          {
            "description": "Report what would stop, and suppress and stop nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would stop, and suppress and stop nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSuppressSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DoNotContactResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suppress many threads' contacts at once",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/length/": {
      "get": {
        "description": "How many conversations the list's filters select. With `unread_only=true` it is the navigation badge: unread threads outside the out-of-office and bounce views.",
        "operationId": "count_inbox_threads",
        "parameters": [
          {
            "description": "Which reading of the inbox to list",
            "in": "query",
            "name": "view",
            "required": false,
            "schema": {
              "default": "all",
              "description": "Which reading of the inbox to list",
              "pattern": "^(all|unlabelled|needs_approval|bounces|reminders|sent|all_mail)$",
              "title": "View",
              "type": "string"
            }
          },
          {
            "description": "Only conversations nobody has read",
            "in": "query",
            "name": "unread_only",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only conversations nobody has read",
              "title": "Unread Only",
              "type": "boolean"
            }
          },
          {
            "description": "Only answered, or only unanswered",
            "in": "query",
            "name": "reply_state",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ReplyState"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only answered, or only unanswered",
              "title": "Reply State"
            }
          },
          {
            "description": "Only this sequence's conversations",
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only this sequence's conversations",
              "title": "Sequence Id"
            }
          },
          {
            "description": "Only this mailbox's conversations",
            "in": "query",
            "name": "mailbox_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only this mailbox's conversations",
              "title": "Mailbox Id"
            }
          },
          {
            "description": "Only this sender's conversations",
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only this sender's conversations",
              "title": "Sender Profile Id"
            }
          },
          {
            "description": "Leave out these sequences' conversations",
            "in": "query",
            "name": "sequence_id__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave out these sequences' conversations",
              "title": "Sequence Id  Not"
            }
          },
          {
            "description": "Leave out these mailboxes' conversations",
            "in": "query",
            "name": "mailbox_id__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave out these mailboxes' conversations",
              "title": "Mailbox Id  Not"
            }
          },
          {
            "description": "Leave out these senders' conversations",
            "in": "query",
            "name": "sender_profile_id__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave out these senders' conversations",
              "title": "Sender Profile Id  Not"
            }
          },
          {
            "description": "Only conversations carrying this label",
            "in": "query",
            "name": "label_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only conversations carrying this label",
              "title": "Label Id"
            }
          },
          {
            "description": "Only email, or only LinkedIn",
            "in": "query",
            "name": "channel",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InboxChannel"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only email, or only LinkedIn",
              "title": "Channel"
            }
          },
          {
            "description": "Only conversations whose last message is at or after this time",
            "in": "query",
            "name": "last_message_at__after",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only conversations whose last message is at or after this time",
              "title": "Last Message At  After"
            }
          },
          {
            "description": "Only conversations whose last message is at or before this time",
            "in": "query",
            "name": "last_message_at__before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only conversations whose last message is at or before this time",
              "title": "Last Message At  Before"
            }
          },
          {
            "description": "Full-text search over every message and the contact's name and address",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Full-text search over every message and the contact's name and address",
              "title": "Search"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count inbox threads",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/{thread_id}/": {
      "delete": {
        "description": "Removes the conversation and its messages from Oneprofile. The contact, their sequence enrolments, and the do-not-contact list are untouched, so a new reply starts a fresh conversation. Attachment bytes stay in the private bucket as a deliberate trade-off: their rows cascade away, the bucket is never publicly readable, and no private-bucket delete helper exists.",
        "operationId": "delete_inbox_thread",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a thread",
        "tags": [
          "inbox"
        ]
      },
      "get": {
        "operationId": "get_inbox_thread",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get one thread",
        "tags": [
          "inbox"
        ]
      },
      "patch": {
        "description": "Change any of three marks, and leave the ones you do not send as they are. `read` false puts the thread back in the triage queue as unread. `done` takes the conversation out of the Inbox until a new message reaches us, theirs or ours: their reply brings it back, and so does an answer of ours that then goes three business days unanswered. An auto-reply, a bounce or a forward does not. It also cancels a reminder the conversation is waiting on, and false clears the mark, leaving the Inbox's own rule to decide again whether it is listed. `snoozed_until` hides the thread from the working views until the given instant; it lives in the `reminders` view meanwhile and simply reappears when the time passes. A reminder also takes off a done mark, so the conversation does come back, which is why a request cannot mark it done and set a reminder together. Null cancels the reminder, and leaves a done mark as it is.",
        "operationId": "update_inbox_thread",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ThreadUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Mark a thread read, done or snoozed",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/{thread_id}/answers/": {
      "post": {
        "description": "The Submit on a conversation's \"Before I draft a reply, I need to know\" card (`question_card`). Give an answer to every question the card asks, each by its id; the sequence's agent then writes the reply with those answers in front of it, charged as any reply it writes, and the reply waits for a person in Needs approval. The card closes once the reply is written. When nothing usable was written it answers 409 saying so, and the card stays open.\n\nEach answer may reword its question (`question`) and says where it is kept (`scope`): `sequence`, the default, as on the card, in the Q&A for the reply's sequence, which every later reply its agent writes reads; `account` in the Q&A for every sequence; `this_reply` for this conversation alone, so a later Write again and every later reply in it have it too (an answer sent with no `scope` was kept so until 2026-10-27). A saved answer goes into the Q&A once the reply is written, signed by the person, under its question as worded: a question its scope has already takes the new answer, and the card's `saved_answers` offers it next time the question is asked.\n\nA saved answer is kept for this conversation instead when its question or answer names the contact by email address or full name (`names_contact`), when its question is new and the Q&A is full (`qa_full`), or when it differs from the answer the Q&A holds in that scope and the caller is not a workspace admin (`admin_only`; a member may still give one sequence its own answer to a question held for every sequence). The reply is written either way; `kept_for_this_conversation` lists those questions and `not_saved` says why for each.\n\nWith `also_answer_waiting`, the agent also answers the other conversations of the sequence waiting on the same questions that the saved answers and the Q&A answer between them (the card's `others_waiting`): each is written in the background as a reply of its own, charged as any reply the agent writes, and waits for approval.\n\nOne person's answers write the reply: answers sent while another person's are being written wait for them, then write nothing, and the 409 names who answered.",
        "operationId": "answer_reply_questions",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnswerQuestionsSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnsweredQuestionsDraftReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "description": "There are not enough credits to write this reply. The card stays open."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "These questions are no longer waiting for an answer: the contact wrote again, somebody answered the reply, or its sequence writes no reply to it. Or somebody else's answers wrote the reply first, and the detail names who. Or the agent may not write it now (busy, its limit reached, the reply rejected), and the detail says why. Or the conversation's sequence is gone, or has no audience table to write from. Or nothing usable was written from the answers, so there is no draft this time. The card stays open unless it was answered."
          },
          "422": {
            "description": "An answer is missing, blank or names no question on the card, or the card asks nothing (a reply only a person can answer): `questions_unanswered`."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Answer the agent's questions on a reply",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/threads/{thread_id}/blocked-reply/retry/": {
      "post": {
        "description": "The button on a conversation's \"No draft for this reply\" line (`blocked_reply`): its sequence's agent would answer the newest reply and wrote no draft for it, and `blocked_reply.reason` says why. The agent writes that reply now, for the person asking, as Draft with AI does: charged as any reply it writes, it waits for a person, and nothing is sent. A reply it leaves to a person by rule (one whose earlier reply was discarded, one long after the sequence ended) is written too, since a person asked. When nothing usable was written it answers 409 saying so, and the line then says so too; the line goes once the draft exists. A refusal leaves the line saying why. With `dry_run` it makes the checks made before the agent is asked and answers the draft as it would stand before its words are written, its words empty, asking no model, charging nothing and writing nothing.",
        "operationId": "retry_blocked_reply",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "description": "Answer the draft as it would stand before its words are written, and write nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer the draft as it would stand before its words are written, and write nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiDraftReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "description": "There are not enough credits to write this reply. The line stays."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The conversation's newest reply no longer waits on a draft: one was written, an answer went, or the contact wrote again. Or the agent may not write it now (writing paused, its sequence's spending limit, busy), and the detail says why. Or the sequence is gone, or has no audience table to write from. Or nothing usable was written, so there is no draft this time."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Have the agent write a reply it wrote no draft for",
        "tags": [
          "inbox-ai"
        ]
      }
    },
    "/inbox/threads/{thread_id}/labels/": {
      "put": {
        "operationId": "put_thread_labels",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ThreadLabelsPutSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadLabelsSetSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Assign exactly this set of labels to a thread",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/{thread_id}/messages/": {
      "get": {
        "description": "Oldest first by default; `order_direction=desc` starts from the latest message, which is how to read the end of a long conversation.",
        "operationId": "list_inbox_messages",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForSentAtId",
              "default": "sent_at",
              "enum": [
                "sent_at",
                "id"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_MessageReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "A thread's messages, oldest-first",
        "tags": [
          "inbox"
        ]
      },
      "post": {
        "description": "Sends from the mailbox that owns the conversation, so the prospect always sees a reply from the address that emailed them. Free of credits. Attachments ride on the email (multipart form). `channel` overrides which channel the reply goes out on when both identities are known; absent, the thread's own channel decides. A pick the thread cannot honour returns 422 with the reason. `to` redirects the reply (first address is the To line, the rest ride as CC) and `bcc` rides blind; both are email-only. `omit_signature` skips the mailbox signature append, for a composer whose body already carries it as visible text. `signature_block` is what the composer shows under the words, the divider and signature as the person left them (empty when they removed it): sent under `body_text` in place of the mailbox's own signature. A reply that reaches the contact while an AI reply waits for approval answers that reply: it is recorded as sent with these words, and with how they stand to what the AI wrote, rather than set aside. One that reaches the contact while that AI reply is being sent, or that an approval of it overtakes, is refused with 409, so the contact never gets two answers. While the contact's newer message waits, one in the words of an AI reply that answers an older message, as written or edited, is refused with 409; one in the person's own words goes, and the AI reply is set aside. A reply that would reach an address on the do-not-contact list is refused with 409 before anything is sent.",
        "operationId": "reply_in_thread",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_reply_in_thread"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "An address the reply would reach is on the do-not-contact list, the conversation's AI reply is already being sent or was sent first, or the reply is in the words of an AI reply to an older message while the contact's newer one waits."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "The mailbox could not send."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Reply in a thread",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/{thread_id}/messages/{message_id}/forward/": {
      "post": {
        "description": "Sends one message of the thread onward with a note, as a NEW email carrying no threading headers, because a colleague's answer must never land in the prospect's conversation. The original's attachments ride along. Recorded on the thread for the record, but the conversation's last activity is left alone.",
        "operationId": "forward_message",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "message_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Message Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/Body_forward_message"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "The mailbox could not send."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Forward a message to somebody else",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/{thread_id}/messages/{message_id}/stop-request/revert/": {
      "post": {
        "description": "Undo on a conversation's \"Asked not to be contacted again\" alert (`stop_request`), for a reply the AI misread. The reply's do-not-contact entry comes off, unless something else keeps the address there (an entry a person added, an unsubscribe). Unless the contact is still blocked, every sequence the request stopped them in for good goes back to how it stood before: the reply's own stop, which Resume undoes. Nothing is sent and nothing restarts on its own. With `dry_run` it answers the same, saying what the Undo would take off the list and put back, and changes nothing.",
        "operationId": "undo_stop_request",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "message_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Message Id",
              "type": "string"
            }
          },
          {
            "description": "Report what the Undo would do, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what the Undo would do, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StopRequestUndoneSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "This reply's stop request was undone already."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Undo what a reply the AI read as asking to stop did",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/{thread_id}/suppress/": {
      "post": {
        "description": "One click: the do-not-contact entry and every cadence stop, together, and the conversation marked done so it leaves the Inbox for All mail. The answer names the sequences that stopped. With `dry_run` it answers the same, naming the sequences that would stop, and changes nothing: the confirm dialog names them before the click, not after.",
        "operationId": "mark_thread_do_not_contact",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would stop, and suppress and stop nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would stop, and suppress and stop nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DoNotContactResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suppress this contact and stop their sequences",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/{thread_id}/unread-reply/resume/": {
      "post": {
        "description": "Resume follow-ups on a conversation's \"Couldn't read this reply\" card, for a person who read the reply and wants the sequence to go on. Every sequence that stopped the contact for it (`stop_reason` `unread_reply`) picks up at the step it kept. The card stays while the AI has not read the reply, so Try again is still there. A contact stopped for anything else is untouched. With `dry_run` it makes the same checks and answers the conversation as Resume would leave it, resuming nothing.",
        "operationId": "resume_after_unread_reply",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "description": "Answer the conversation as Resume would leave it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer the conversation as Resume would leave it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "Nothing this reply stopped is still stopped for it."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Resume the follow-ups a reply the AI could not read stopped",
        "tags": [
          "inbox"
        ]
      }
    },
    "/inbox/threads/{thread_id}/unread-reply/retry/": {
      "post": {
        "description": "Try again on a conversation's \"Couldn't read this reply\" card (`unread_reply_id`). The reply waits for a verdict again and the AI reads it once more, writing an answer for approval when the verdict says so, as on the day it landed. While it is read, the contact's follow-ups that it stopped are put back where they stood and held, and the verdict stops them again when a person wrote it. If the AI fails again, the card comes back. With `dry_run` it makes the same checks and answers the conversation as Try again would leave it, reading, holding and resuming nothing.",
        "operationId": "read_reply_again",
        "parameters": [
          {
            "in": "path",
            "name": "thread_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Thread Id",
              "type": "string"
            }
          },
          {
            "description": "Answer the conversation as Try again would leave it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer the conversation as Try again would leave it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "This reply is being read again, or was read or answered since."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Have the AI read again a reply it could not read",
        "tags": [
          "inbox"
        ]
      }
    },
    "/integrations/": {
      "delete": {
        "description": "Delete multiple integrations by their IDs. Max 100 IDs per request. With dry_run it answers what a delete would and deletes nothing.",
        "operationId": "bulk_delete_integrations",
        "parameters": [
          {
            "description": "IDs of integrations to delete",
            "in": "query",
            "name": "ids",
            "required": true,
            "schema": {
              "description": "IDs of integrations to delete",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "minItems": 1,
              "title": "Ids",
              "type": "array"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Bulk delete integrations",
        "tags": [
          "integrations"
        ]
      },
      "get": {
        "description": "List all integrations created for the organization. Responses are paginated. The capability filter keeps the tools a table can import from, export to or look records up in, and each record type says what its tool can do with it. Only a signed-in person may send `with_identity_fields`: an API key is refused (403).",
        "operationId": "list_integrations",
        "parameters": [
          {
            "in": "query",
            "name": "capability",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/IntegrationCapability"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only integrations whose tool can do this for at least one record type: 'list_records' (a table can import from it), 'write_records' (a table can export to it) or 'get_record' (a lookup column can fetch one record from it by an identity value). Read off the tool's capabilities, so it costs no network call."
            },
            "description": "Only integrations whose tool can do this for at least one record type: 'list_records' (a table can import from it), 'write_records' (a table can export to it) or 'get_record' (a lookup column can fetch one record from it by an identity value). Read off the tool's capabilities, so it costs no network call."
          },
          {
            "in": "query",
            "name": "integration_type__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 255,
                    "type": "string"
                  },
                  "maxItems": 50,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Exclude integrations with these integration types",
              "title": "Integration Type  Not"
            },
            "description": "Exclude integrations with these integration types"
          },
          {
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/IntegrationKindFilter"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by integration kind (source, destination, or both)"
            },
            "description": "Filter by integration kind (source, destination, or both)"
          },
          {
            "in": "query",
            "name": "record_type__in",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 255,
                    "type": "string"
                  },
                  "maxItems": 50,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter to integrations that handle any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.",
              "title": "Record Type  In"
            },
            "description": "Filter to integrations that handle any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Search integrations by name or type. Multi-word queries use AND logic.",
              "title": "Search"
            },
            "description": "Search integrations by name or type. Multi-word queries use AND logic."
          },
          {
            "in": "query",
            "name": "with_identity_fields",
            "required": false,
            "schema": {
              "default": false,
              "description": "Probe each live connection for the fields a lookup may key on and put them on its record types. Slower: it calls the connected tools, and a connection that does not answer in budget keeps them null.",
              "title": "With Identity Fields",
              "type": "boolean"
            },
            "description": "Probe each live connection for the fields a lookup may key on and put them on its record types. Slower: it calls the connected tools, and a connection that does not answer in budget keeps them null."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtNameCreatedByDisplayName",
              "default": "id",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "name",
                "created_by_display_name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          },
          {
            "description": "Sort worst configuration health to the top, with order_by as the secondary within-group sort. Disable to sort purely by order_by.",
            "in": "query",
            "name": "health_first",
            "required": false,
            "schema": {
              "default": true,
              "description": "Sort worst configuration health to the top, with order_by as the secondary within-group sort. Disable to sort purely by order_by.",
              "title": "Health First",
              "type": "boolean"
            }
          },
          {
            "description": "With health_first, which end of the health order comes first: worst_first (errors on top, the default) or best_first.",
            "in": "query",
            "name": "health_order",
            "required": false,
            "schema": {
              "default": "worst_first",
              "description": "With health_first, which end of the health order comes first: worst_first (errors on top, the default) or best_first.",
              "enum": [
                "worst_first",
                "best_first"
              ],
              "title": "Health Order",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_IntegrationReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List all integrations",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/bulk/verify/": {
      "post": {
        "description": "Trigger background health checks for a selection of integrations. The selection is either an explicit ID list or a filter-based select-all that genuinely spans every page (past the per-page cap); a select-all that names no filter needs all=true. Checks run asynchronously in the background (they complete even if the user navigates away). The answer names the run: poll its progress from the runs route.",
        "operationId": "trigger_health_checks",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkHealthCheckSelectionSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationBulkVerifyResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Bulk trigger health checks",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/categories/": {
      "get": {
        "description": "List the directory's integration categories with their descriptions, by name. Each says how many integrations it holds, 'coming soon' ones included; the catalog's overall size is GET /integrations/categories/length/.",
        "operationId": "list_integration_categories",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdName",
              "default": "name",
              "enum": [
                "id",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_CategoryReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List integration categories",
        "tags": [
          "integration-types"
        ]
      }
    },
    "/integrations/categories/length/": {
      "get": {
        "description": "How many categories the directory has, and after it integration_count: how many integrations the directory holds in all, 'coming soon' ones included. The directory's headline size.",
        "operationId": "count_integration_categories",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationCategoryCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count integration categories",
        "tags": [
          "integration-types"
        ]
      }
    },
    "/integrations/length/": {
      "get": {
        "description": "Get the number of integrations for the organization.",
        "operationId": "count_integrations",
        "parameters": [
          {
            "description": "Filter by integration kind (source, destination, or both)",
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/IntegrationKindFilter"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by integration kind (source, destination, or both)",
              "title": "Kind"
            }
          },
          {
            "description": "Only integrations whose tool can do this for at least one record type: 'list_records' (a table can import from it), 'write_records' (a table can export to it) or 'get_record' (a lookup column can fetch one record from it by an identity value). Read off the tool's capabilities, so it costs no network call.",
            "in": "query",
            "name": "capability",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/IntegrationCapability"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only integrations whose tool can do this for at least one record type: 'list_records' (a table can import from it), 'write_records' (a table can export to it) or 'get_record' (a lookup column can fetch one record from it by an identity value). Read off the tool's capabilities, so it costs no network call.",
              "title": "Capability"
            }
          },
          {
            "description": "Exclude integrations with these integration types",
            "in": "query",
            "name": "integration_type__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 255,
                    "type": "string"
                  },
                  "maxItems": 50,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Exclude integrations with these integration types",
              "title": "Integration Type  Not"
            }
          },
          {
            "description": "Filter to integrations that handle any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.",
            "in": "query",
            "name": "record_type__in",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 255,
                    "type": "string"
                  },
                  "maxItems": 50,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter to integrations that handle any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.",
              "title": "Record Type  In"
            }
          },
          {
            "description": "Search integrations by name or type. Multi-word queries use AND logic.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Search integrations by name or type. Multi-word queries use AND logic.",
              "title": "Search"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the number of integrations",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/name/suggestions/": {
      "get": {
        "description": "Suggest a unique integration name for a given integration type. Returns a name in the format '{integration_type}' or '{integration_type} (N)' if the base name is already taken.",
        "operationId": "suggest_integration_name",
        "parameters": [
          {
            "description": "The type of integration (e.g., 'google_sheets')",
            "in": "query",
            "name": "integration_type",
            "required": true,
            "schema": {
              "description": "The type of integration (e.g., 'google_sheets')",
              "maxLength": 255,
              "minLength": 1,
              "title": "Integration Type",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuggestedIntegrationNameSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest an integration name",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/record-types/": {
      "get": {
        "description": "List the global vocabulary of record types across all integrations, as display-ready options for the record-type filter on the integrations list and the directory. Includes a single 'Custom' entry when any integration accepts arbitrary record types.",
        "operationId": "list_record_type_vocabulary",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_IntegrationRecordTypeReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the record-type vocabulary",
        "tags": [
          "integration-types"
        ]
      }
    },
    "/integrations/runs/{run_id}/": {
      "get": {
        "description": "Return live progress and a consolidated, status-grouped summary for a bulk health check run. An integration counts as checked once its latest health check is newer than the run's start time. Poll this until checked == total, then render the grouped summary and links to the failures. A run is kept for a day.",
        "operationId": "get_health_checks_summary",
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationRunReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Run not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Bulk health check progress and summary",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/types/": {
      "get": {
        "description": "List all available integration types with their categories, display names and descriptions. Supports search, category, and kind filtering.",
        "operationId": "list_integration_types",
        "parameters": [
          {
            "in": "query",
            "name": "boost_categories",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 255,
                    "type": "string"
                  },
                  "maxItems": 50,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Category slugs to boost. Integrations in these categories appear first in results.",
              "title": "Boost Categories"
            },
            "description": "Category slugs to boost. Integrations in these categories appear first in results."
          },
          {
            "in": "query",
            "name": "category_slug",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter integration types by category slug",
              "title": "Category Slug"
            },
            "description": "Filter integration types by category slug"
          },
          {
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/IntegrationKindFilter"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by integration kind"
            },
            "description": "Filter by integration kind"
          },
          {
            "in": "query",
            "name": "record_type__in",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 255,
                    "type": "string"
                  },
                  "maxItems": 50,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter to integration types that sync any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match.",
              "title": "Record Type  In"
            },
            "description": "Filter to integration types that sync any of these record types (match ANY). Unknown slugs are ignored; wildcard integrations always match."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Search integration types by name or description",
              "title": "Search"
            },
            "description": "Search integration types by name or description"
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtName",
              "default": "name",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_IntegrationTypeReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List all available integration types",
        "tags": [
          "integration-types"
        ]
      }
    },
    "/integrations/types/{name}/": {
      "get": {
        "description": "Get detailed information about a specific integration type by its name. Returns the integration type's categories, display name, description, and configuration schemas.",
        "operationId": "get_integration_type",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "title": "Name",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationTypeReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration type not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a specific integration type",
        "tags": [
          "integration-types"
        ]
      }
    },
    "/integrations/types/{name}/guide/": {
      "get": {
        "description": "Get the setup guide for a specific integration type. Returns the full guide content as markdown with step-by-step instructions for obtaining credentials and configuring the integration.",
        "operationId": "get_integration_type_guide",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "maxLength": 255,
              "minLength": 1,
              "title": "Name",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationTypeGuideReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No guide found for this integration type"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get setup guide for an integration type",
        "tags": [
          "integration-types"
        ]
      }
    },
    "/integrations/{integration_id}/": {
      "delete": {
        "description": "Delete an integration by its ID. With dry_run it answers what a delete would and deletes nothing.",
        "operationId": "delete_integration",
        "parameters": [
          {
            "in": "path",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete an integration",
        "tags": [
          "integrations"
        ]
      },
      "get": {
        "description": "Get an integration by its ID, with its config and which of its credentials are set.",
        "operationId": "get_integration",
        "parameters": [
          {
            "in": "path",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationDetailReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get an integration",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/{integration_id}/audit-logs/": {
      "get": {
        "description": "List the configuration change history for an integration (created, updated, deleted), ordered by creation time. Credential changes are recorded without their values.",
        "operationId": "list_integration_audit_logs",
        "parameters": [
          {
            "in": "path",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_IntegrationAuditLogReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List audit logs for an integration",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/{integration_id}/health-checks/": {
      "get": {
        "description": "List recent health check results for an integration, newest first.",
        "operationId": "list_health_checks",
        "parameters": [
          {
            "in": "path",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCheckedAt",
              "default": "checked_at",
              "enum": [
                "checked_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_HealthCheckReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List health check history",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/{integration_id}/identity-fields/": {
      "get": {
        "description": "Asks the LIVE connection which identity fields its lookups accept for one record type: the editor's select, fetched once a connection and record type are chosen. Expired credentials fail here with a message about the connection rather than at run time.",
        "operationId": "get_lookup_identity_fields",
        "parameters": [
          {
            "in": "path",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "record_type",
            "required": true,
            "schema": {
              "title": "Record Type",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LookupIdentityFieldSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the fields one record type can be looked up by",
        "tags": [
          "table-integration-lookup"
        ]
      }
    },
    "/integrations/{integration_id}/properties/": {
      "get": {
        "description": "List the property names the integration exposes for a record type, read live from the integration's API, by name. Supports optional search filtering by property name. A kind the integration cannot list for that record type answers none: see can_list_builtin_properties and can_list_custom_properties on its record types. Paged: page on with `next_page_cursor`; each page reads the tool's listing afresh.",
        "operationId": "list_integration_properties",
        "parameters": [
          {
            "in": "path",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "kind",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/PropertyKind",
              "description": "Filter by property kind (builtin or custom)"
            },
            "description": "Filter by property kind (builtin or custom)"
          },
          {
            "in": "query",
            "name": "record_type",
            "required": true,
            "schema": {
              "description": "Record type to list properties for (e.g., 'person', 'contact')",
              "maxLength": 255,
              "minLength": 1,
              "title": "Record Type",
              "type": "string"
            },
            "description": "Record type to list properties for (e.g., 'person', 'contact')"
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Search properties by name (case-insensitive)",
              "title": "Search"
            },
            "description": "Search properties by name (case-insensitive)"
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForName",
              "default": "name",
              "enum": [
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_PropertyReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List all known properties for an integration",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/{integration_id}/record-types/": {
      "get": {
        "description": "List the record types of an integration, builtin first (statically-known, e.g. 'customer', 'product'), then custom ones (created on the integration side and discovered via its API, e.g. Attio custom objects or database tables). Each says whether its builtin and its custom fields can be listed. Record types represent the object types that can be synced. The internal wildcard ('*') is never included. Paged: page on with `next_page_cursor`; each page reads the tool's listing afresh.",
        "operationId": "list_integration_record_types",
        "parameters": [
          {
            "in": "path",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ConnectionRecordTypeReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List record types for an integration",
        "tags": [
          "integrations"
        ]
      }
    },
    "/integrations/{integration_id}/verify/": {
      "post": {
        "description": "Manually trigger a health check for an integration.",
        "operationId": "trigger_health_check",
        "parameters": [
          {
            "in": "path",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthCheckReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Trigger a health check",
        "tags": [
          "integrations"
        ]
      }
    },
    "/leads/columns/": {
      "get": {
        "description": "The columns a table built from this search type can show, in order, and which of them a preview reveals. Free to call and never fetches a row, so a builder can draw the table header before any preview is bought. A column that no added lead fills is left out when the table is created; a preview, which has leads in hand, lists only the columns they fill. Buying-signal searches take the chosen signal as `signal_type`, which adds the columns that signal's own details earn. A startup launch search takes its boards as `launch_sources`, which leaves out the columns of facts none of them carries. A fixed plan that never passes one page. What one row costs and whether the search can be previewed are `GET /leads/record-types/{record_type}/`.",
        "operationId": "list_lead_search_columns",
        "parameters": [
          {
            "in": "query",
            "name": "record_type",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/LeadRecordType"
            }
          },
          {
            "description": "For a buying-signal search, the one signal it looks for. Ignored for every other search.",
            "in": "query",
            "name": "signal_type",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 64,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "For a buying-signal search, the one signal it looks for. Ignored for every other search.",
              "title": "Signal Type"
            }
          },
          {
            "description": "For a startup launch search, the boards it searches, repeated (`?launch_sources=producthunt&launch_sources=uneed`). None plans the columns of every board. Ignored for every other search.",
            "in": "query",
            "name": "launch_sources",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/LaunchSource"
                  },
                  "maxItems": 50,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "For a startup launch search, the boards it searches, repeated (`?launch_sources=producthunt&launch_sources=uneed`). None plans the columns of every board. Ignored for every other search.",
              "title": "Launch Sources"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LeadColumnSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the columns a search would create",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/company-table/": {
      "get": {
        "description": "What a column of one of your tables holds right now, read the way a people search following it (`company_table`) reads it: the table's, column's and view's names, how many distinct companies it holds, the first few of them, how many values are company names a search cannot match, and whether it holds more companies than one search can follow. With `check_role`, it also counts the people at each company and lists the companies no one works at (`current`) or once worked at (`past`), each with a company of the same name that does have people, when the table names one. Free to call, and adds nothing; the check takes up to half a minute the first time. A key that can only read is refused `check_role`: the check asks the people data provider about each company.",
        "operationId": "get_company_table",
        "parameters": [
          {
            "description": "The table holding the companies.",
            "in": "query",
            "name": "table_id",
            "required": true,
            "schema": {
              "description": "The table holding the companies.",
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The column with each company's website, web address, LinkedIn company page or numeric LinkedIn id. A column of company names matches no one.",
            "in": "query",
            "name": "column_id",
            "required": true,
            "schema": {
              "description": "The column with each company's website, web address, LinkedIn company page or numeric LinkedIn id. A column of company names matches no one.",
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          },
          {
            "description": "A saved view of that table: only the rows its filter keeps are read. Omit it to read every row.",
            "in": "query",
            "name": "view_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "A saved view of that table: only the rows its filter keeps are read. Omit it to read every row.",
              "title": "View Id"
            }
          },
          {
            "description": "Also list the companies no one in the people search works at: `current` counts the job held now, `past` one that ended. Omit it to read the column alone.",
            "in": "query",
            "name": "check_role",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/EmployerRole"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Also list the companies no one in the people search works at: `current` counts the job held now, `past` one that ended. Omit it to read the column alone.",
              "title": "Check Role"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompanyTableResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "A key that can only read sent `check_role`."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The table, the column or the view was deleted."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read a table of companies a people search can follow",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/enrichment-options/": {
      "get": {
        "description": "Every enrichment that applies to a lead import of this search type, with the exact per-row credit price of each and whether its column already exists in the search's own column plan (`already_covered`). One that applies but is not available right now, for any workspace, is a row with `available` false and no price, listed after the ones that can run: it cannot be chosen. What the rows themselves cost before any enrichment is `GET /leads/record-types/{record_type}/`; an import's total is that plus the chosen options, each counted once. A fixed catalogue that never passes one page. Free to call.",
        "operationId": "list_lead_enrichment_options",
        "parameters": [
          {
            "in": "query",
            "name": "record_type",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/LeadRecordType"
            }
          },
          {
            "in": "query",
            "name": "row_count",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Row Count"
            }
          },
          {
            "description": "For a buying-signal search, the one signal it looks for. Ignored for every other search. Read only so `already_covered` also checks that signal's own columns.",
            "in": "query",
            "name": "signal_type",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 64,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "For a buying-signal search, the one signal it looks for. Ignored for every other search. Read only so `already_covered` also checks that signal's own columns.",
              "title": "Signal Type"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LeadEnrichmentOptionSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the enrichments offered at import",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/length/": {
      "post": {
        "description": "Count the leads matching a set of filters. Free to the customer: no credits are consumed, so it is safe to call as filters change. Buying-signal searches have no live count: they answer with a null total and `supported: false`, and a preview shows what they find.",
        "operationId": "count_leads",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LeadSearchRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadCountResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderFailureResponseSchema"
                }
              }
            },
            "description": "The lead database refused the query."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count matching leads",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/places/search/": {
      "get": {
        "description": "Resolve one address to the point a radius search would centre on, so a builder can show where it is and how far the radius reaches before anything is searched. Free to call, and answers from a thirty-day cache for an address that has been asked before. An address that matches nothing comes back as a filter complaint against `area`, the same refusal a search would give. Results are Google Maps data: any surface that displays them must credit \u201cGoogle Maps\u201d. A key that can only read is refused: each new address is a paid lookup.",
        "operationId": "geocode_lead_search_area",
        "parameters": [
          {
            "description": "A street address, neighbourhood, postcode or city.",
            "in": "query",
            "name": "address",
            "required": true,
            "schema": {
              "description": "A street address, neighbourhood, postcode or city.",
              "maxLength": 255,
              "minLength": 1,
              "title": "Address",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeocodedAddressResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderFailureResponseSchema"
                }
              }
            },
            "description": "The address matched nothing, or the geocoder could not be reached."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Find an address on the map",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/preview/": {
      "post": {
        "description": "Fetch a preview of at most five of the leads matching a set of filters: a sample of the table the search would build, before it is made. The answer is the column plan the table would have plus, for each sample lead, the values of the revealed columns only: a person's name, job title and company, or a company's name. Every other value, email included, stays on the server until the search becomes a table. Unlike counting, retrieving leads is billable upstream, so previews are explicit, never automatic, and capped far below a search. Search types whose rows cost credits offer no preview at all and answer 422: ask `GET /leads/record-types/{record_type}/` for `preview_supported` before showing the button. The answer also names a table the same search built before, when one still exists.",
        "operationId": "preview_leads",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LeadSearchRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadPreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "The organisation's plan or credit balance blocks previewing."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderFailureResponseSchema"
                }
              }
            },
            "description": "The lead database refused the query."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview matching leads",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/recent-searches/": {
      "get": {
        "description": "The searches this workspace actually ran, recorded automatically: previews and imports alike, newest activity first. Re-browsing the same filters refreshes the latest entry rather than duplicating it.",
        "operationId": "list_lead_search_history",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdRanAt",
              "default": "ran_at",
              "enum": [
                "id",
                "ran_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LeadSearchHistoryEntrySchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List recorded lead searches",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/recent-searches/{entry_id}/": {
      "delete": {
        "description": "Hides one recorded search from the caller's own recents. The entry stays in the workspace's history and in every teammate's recents; removing it twice is not an error, and answers `count` 0, \"Already out of your recents\". With `dry_run`, answers the same and hides nothing.",
        "operationId": "remove_lead_search_from_recents",
        "parameters": [
          {
            "in": "path",
            "name": "entry_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Entry Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be removed, and remove nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be removed, and remove nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such recorded search."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Remove a search from your recents",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/record-types/{record_type}/": {
      "get": {
        "description": "What one row of this search type costs, in credits, before any enrichment, and whether it can be previewed at all. Free to call and never fetches a row, so a builder can quote the price and decide on the preview button before anything is spent. With `row_count`, it also quotes what that many rows cost, request charges included.",
        "operationId": "get_lead_record_type",
        "parameters": [
          {
            "in": "path",
            "name": "record_type",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/LeadRecordType"
            }
          },
          {
            "description": "Rows a run would add, to quote their total as `credits_for_rows`; omit for the per-row price alone.",
            "in": "query",
            "name": "row_count",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Rows a run would add, to quote their total as `credits_for_rows`; omit for the per-row price alone.",
              "title": "Row Count"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadRecordTypeReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a search type's row price",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/saved-searches/": {
      "get": {
        "description": "Saved searches, most recently used first. `scope=mine` restricts the listing to searches the caller saved; the default lists the whole workspace's.",
        "operationId": "list_saved_lead_searches",
        "parameters": [
          {
            "in": "query",
            "name": "scope",
            "required": false,
            "schema": {
              "default": "workspace",
              "enum": [
                "workspace",
                "mine"
              ],
              "title": "Scope",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForLastUsedAtCreatedAtName",
              "default": "last_used_at",
              "enum": [
                "last_used_at",
                "created_at",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SavedLeadSearchResponseSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List saved lead searches",
        "tags": [
          "find-leads"
        ]
      },
      "post": {
        "description": "Keep a named copy of the current filters for later reuse. Saving runs nothing and costs nothing.",
        "operationId": "save_lead_search",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveLeadSearchRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedLeadSearchResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Save a lead search",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/saved-searches/suggestions/": {
      "get": {
        "description": "A few ready-to-load searches, all targeting the given record type. Written from the workspace's business context when it has one (tailored is true); otherwise a standard set every workspace gets (tailored is false). Suggestions are recipes: nothing runs and nothing is spent until one is loaded and acted on. Buying-signal searches are built from their own picker, so they come back with an empty list rather than an error. A tailored batch is written by a model, so a key that can only read is refused.",
        "operationId": "suggest_lead_searches",
        "parameters": [
          {
            "in": "query",
            "name": "record_type",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/LeadRecordType"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadSearchSuggestionListResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest starter lead searches",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/saved-searches/{saved_search_id}/": {
      "delete": {
        "description": "Remove a saved search. Tables built from it are untouched. With `dry_run`, answers the same and removes nothing.",
        "operationId": "delete_saved_lead_search",
        "parameters": [
          {
            "in": "path",
            "name": "saved_search_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Search Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved search not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a saved lead search",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/saved-searches/{saved_search_id}/open/": {
      "post": {
        "description": "Marks the search as just-used so the recents ordering stays honest, and returns it. Runs nothing.",
        "operationId": "touch_saved_lead_search",
        "parameters": [
          {
            "in": "path",
            "name": "saved_search_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Search Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedLeadSearchResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved search not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Record a saved search being loaded",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/signal-types/": {
      "get": {
        "description": "Every buying signal a signals search can filter on, filed under the headings the picker groups them by, with the subtypes each one offers. The headings are the rows, and all of them come in one page. Free to call, and changes only a few times a year.",
        "operationId": "list_lead_signal_types",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LeadSignalTypeGroupSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderFailureResponseSchema"
                }
              }
            },
            "description": "The signal provider refused the request."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the buying signals a search can look for",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/startup-launches/batches/": {
      "get": {
        "description": "Every accelerator batch the listings we hold name, newest first, spelled the way the `batches` filter takes them (\"Winter 2026\"). Grows by a few a year. Free to call.",
        "operationId": "list_startup_launch_batches",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForName",
              "default": "name",
              "enum": [
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_StartupLaunchBatchReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the accelerator batches",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/startup-launches/filters/": {
      "get": {
        "description": "Every filter of a startup launch search, in the order the search takes them, with the boards each applies to and the values a list filter offers. A filter on a fact only some boards carry (votes, a batch, MRR) applies to the boards whose listings carry it, read off the crawl, and setting it keeps only their listings. A fixed catalogue that never passes one page. Free to call.",
        "operationId": "list_startup_launch_filters",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_StartupLaunchFilterReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the startup launch filters",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/startup-launches/sources/": {
      "get": {
        "description": "Every board a startup launch search reads: its name, its site, the first day its listings are complete from, how many we hold, the newest day listed, when a crawl last read it, and the facts only some boards carry (`fields`) that its listings can carry. A fixed catalogue that never passes one page. Free to call.",
        "operationId": "list_startup_launch_sources",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_StartupLaunchSourceReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the startup launch boards",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/table-name/suggestions/": {
      "post": {
        "description": "Name the table a lead search would fill after the search itself: the first value of each of its most telling filters, joined with commas in the order the search is said out loud ('C-suite, Software Development, North America, 50-200 employees'). A search with nothing to name it by is called after its rows and today's date in the viewer's time zone ('People, Sep 25, 2026'). Free, runs no search and changes nothing. A table created from a search without a name takes this one, dated in UTC.",
        "operationId": "suggest_lead_table_name",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LeadTableNameRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuggestedLeadTableNameSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest a name for a lead search's table",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/leads/vocabulary/suggestions/": {
      "post": {
        "description": "Checks a list of pasted or typed values against one of the search builder's closed vocabularies (a department, a seniority, a size band, an industry or a company type) and returns, for each value, its exact match, the closest option, or neither. Read-only: it runs no search and changes nothing.",
        "operationId": "match_lead_values",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MatchLeadValuesRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchedLeadValuesSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Match pasted values against a closed vocabulary",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/linkedin/agent/actions/next/": {
      "post": {
        "description": "Hands out one action, if and only if the governor allows it: the account is active and not at a checkpoint, no other step is running, the last one was handed out long enough ago, the kind still has daily headroom, the rolling weekly connection request ceiling is not reached, and credit covers it. A step the Oneprofile team fired to test the sender goes first and waits for none of those but the first two; asked with `unmetered_only`, only such a step is handed out. A step whose browser stopped reporting is resolved first. When nothing is handed out the response says why, which is what lets the panel distinguish an empty queue from a paced one: `in_flight`, `pacing` (with when to ask again), `daily_cap` or `weekly_cap` (only while claimable work waits behind them), `checkpoint`, `not_connected`, `insufficient_credits`, or null for an empty queue.",
        "operationId": "linkedin_agent_pull_next",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentNextRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentNextActionSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Claim the next permitted action",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/actions/{action_id}/attempts/": {
      "post": {
        "description": "Sent instead of a result by a build that reports attempts (attempts:v1) when a run of the step it holds was cut off without an error from LinkedIn: a person closed the working tab, the extension restarted, a page never loaded, the tab froze, the identity page never answered, LinkedIn never answered a press, or the server could not be asked. The server records the attempt, counts it against the step unless a person closed the tab or the server could not be asked, and answers with what to do: retry (run it again as next_run_id), look_first (run it again, looking on LinkedIn before any press), stop (it was cut off too often and is settled failed; post nothing), lost (the claim is not this browser's any more; post nothing) or not_retryable (not an interruption, or a press LinkedIn never answered or a page that never drew at the cap; post the result). When the step goes on, the press fence moves to the next run and the claim's lease is extended. The same report again (the same stopped run) gets the same answer and changes nothing.",
        "operationId": "linkedin_agent_report_attempt",
        "parameters": [
          {
            "in": "path",
            "name": "action_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Action Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentAttemptSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentAttemptAnswerSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such action on the account this token is bound to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Report a run of a step that was cut off, and ask what to do with the step",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/actions/{action_id}/commit/": {
      "post": {
        "description": "Asked by a build that resumes steps (resume:v1) right before every press that sends, follows, likes or withdraws. Granted only to the claim named, still this browser's, inside its lease, and to one run of it at a time; the lease moves on with the grant. The grant is the server's record that the step may have happened: no grant, nothing happened. A paused sequence or a closed sending window does not refuse it, because a step already running may finish. A step held into a new day whose limit is spent is refused with requeue_at_reset and waits for the reset; it never fails for it. A message not pressed yet while its sender's inbox goes unread, or its member's reply waits to be read, is refused with wait_for_replies and goes back in line.",
        "operationId": "linkedin_agent_commit",
        "parameters": [
          {
            "in": "path",
            "name": "action_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Action Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentCommitSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentCommitGrantSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such action on the account this token is bound to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Ask to press the control that changes LinkedIn",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/actions/{action_id}/diagnostic/": {
      "post": {
        "description": "The heavy half of a page report, posted after the step's result has landed: the structure of the part of LinkedIn's page the browser was reading (tags, a few attributes, icon names, text lengths, never text) and how many elements each selector candidate matched there. Cleaned again on arrival and kept only when it adds evidence. Never refused for its content, so a report can never cost a result.",
        "operationId": "linkedin_agent_post_diagnostic",
        "parameters": [
          {
            "in": "path",
            "name": "action_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Action Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": true,
                "title": "Snapshot",
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentDiagnosticStoredSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Attach a page snapshot to a step's report",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/actions/{action_id}/reject/": {
      "post": {
        "description": "The side panel's Skip this one: the person watching passes over the step, which is taken out of the line, or stopped if a browser is running it. Never charged; a running step may have partly happened, so it still counts against the day's limit and its history says so. A sequence's contact moves on past the step. A step that already finished is refused. The reason a build sends is not read.",
        "operationId": "linkedin_agent_reject",
        "parameters": [
          {
            "in": "path",
            "name": "action_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Action Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentRejectSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInActionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such action on the account this token is bound to."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The step already finished."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Skip a step from the side panel",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/actions/{action_id}/release/": {
      "post": {
        "description": "For a step this browser cannot go on with here: it looked and found the step not done but may not finish it now, the person closed the working tab again, no window is open, or the page stopped under it. A step that may have touched LinkedIn goes back to be looked at again; any other goes back to the line, giving back its daily unit and its credit hold. Only `interrupted` counts against the step, and the fourth time fails it for a person to retry. A step no longer claimed by this browser is refused with 409.",
        "operationId": "linkedin_agent_release",
        "parameters": [
          {
            "in": "path",
            "name": "action_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Action Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentReleaseSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInActionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such action on the account this token is bound to."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The step is not this browser's."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Hand back a running step without settling it",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/actions/{action_id}/result/": {
      "post": {
        "description": "Settles an action the browser has finished with. Only a step that is still running settles, so a flaky connection can never double-charge: a report for a step already settled, cancelled or skipped in the side panel, or given up on after its browser stopped reporting is refused with 409 and changes nothing. Any non-success returns both the daily budget unit and the credit hold. A failed sequence step stops its contact at that step until a person retries it.",
        "operationId": "linkedin_agent_post_result",
        "parameters": [
          {
            "in": "path",
            "name": "action_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Action Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentResultSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInActionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such action on the account this token is bound to."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The step was already settled."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The outcome is not a member of the catalogue, or is tagged with a different kind than the action it settles."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Report an action's outcome",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/config/": {
      "get": {
        "description": "Serves the versioned document of CSS selectors, URL patterns, bootstrap type names and pacing the extension runs on. It carries data only, never code, so a LinkedIn markup change becomes a backend deploy rather than a Web Store submission. The extension validates the payload against its compiled-in fallback before trusting it, so a malformed field degrades to that fallback.",
        "operationId": "linkedin_agent_config",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": true,
                  "title": "Response Linkedin Agent Config",
                  "type": "object"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Fetch the remote selector and pacing config",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/disconnect/": {
      "post": {
        "description": "Identical to disconnecting from the dashboard: every browser is signed out, work stops, history stays, and the connection token is replaced. Called BEFORE the extension wipes its own state, so a disconnect from the panel can never leave a live session behind on the server.",
        "operationId": "linkedin_agent_disconnect",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Disconnect the account from the side panel",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/heartbeat/": {
      "post": {
        "description": "Records that a browser is alive, renews its exclusive lease on the account, and returns the run state the extension must obey, which is how a change made in the web app (the sender's approval setting, a limit) reaches the browser without a push channel. Also carries the wrong-account guard: if the browser is signed in as somebody other than the bound member, the response says so and the extension must stop. A reported checkpoint is applied only from the browser holding the lease; a browser that does not hold it is told which browser does. While work is queued it also says what the next step waits on and until when, and asks for check-ins at most 15 seconds apart while work is about to run. It says how many of the sender's steps wait for a person on Tasks, less those a paused sequence or paused contact holds, and whether a step that waits for no gap is ready.",
        "operationId": "linkedin_agent_heartbeat",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentHeartbeatSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentStateSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Report liveness and read the authoritative run state",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/history/": {
      "post": {
        "description": "Settled actions newest first with lifetime stats: the dashboard's history, verbatim.",
        "operationId": "linkedin_agent_history",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "default": 0,
              "minimum": 0,
              "title": "Offset",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInHistoryPageSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "List completed steps, for the side panel",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/pair/": {
      "post": {
        "description": "The only unauthenticated route in this package: the connection token a person pasted IS the credential, and the sender it names was fixed server-side when the token was minted, so nothing the extension sends can redirect it. Every browser that connects gets its own agent token. A connected sender accepts only the LinkedIn member it is bound to; a disconnected or never-connected sender takes whoever connects. One LinkedIn member is connected to at most one sender. A browser pairing again passes its previous session so that one is signed out.",
        "operationId": "linkedin_agent_pair",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentPairSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentPairResultSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The connection token is invalid, or the sender is connected as another member."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This LinkedIn member is already connected to another sender."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "summary": "Connect a browser with a sender's connection token",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/queue/": {
      "post": {
        "description": "The same rows, in the same order, the dashboard's queue shows, less the waiting steps a paused sequence or paused contact holds: those are no browser's work until they are resumed. A step is queued only once it may run, so every row reads approved the moment it was queued: a step waiting for a person waits on Tasks, never here.",
        "operationId": "linkedin_agent_queue",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/LinkedInActionReadSchema"
                  },
                  "title": "Response Linkedin Agent Queue",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "List the queue, for the side panel",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/linkedin/agent/state/": {
      "post": {
        "description": "Writes the sender's LinkedIn approval setting (`run_mode`), the same setting the sender's Settings tab writes, so the two surfaces have one source of truth rather than two that drift. An empty body reads the state without changing it. With a lease nonce, the answer also says whether this browser holds the lease, and which browser does when it does not.",
        "operationId": "linkedin_agent_set_state",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentSetStateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentStateSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "The agent token is invalid, revoked, or expired."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          }
        ],
        "summary": "Set the sender's approval setting from the extension",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/mailboxes/": {
      "delete": {
        "description": "Delete the selection in one statement. Ids that no longer exist are skipped rather than failing the request, so a stale selection still removes everything it can. `count` reports what actually went. Also answers how many live contacts deleting them stops, per sequence: a contact is only ever emailed from the mailbox that first emailed them, so a deleted mailbox stops them and nobody is moved to another one. With `dry_run` it answers the same and deletes nothing, which is how to see who a delete stops before making it.",
        "operationId": "bulk_delete_mailboxes",
        "parameters": [
          {
            "description": "Mailboxes to delete",
            "in": "query",
            "name": "ids",
            "required": true,
            "schema": {
              "description": "Mailboxes to delete",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "minItems": 1,
              "title": "Ids",
              "type": "array"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxBulkDeleteResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete many mailboxes",
        "tags": [
          "senders"
        ]
      },
      "get": {
        "description": "The ops list and the profile editor's picker share this endpoint. Two status filters, and they read differently on purpose: `connection_status` is the stored grant state, where `connected` means anything that is not broken; `health` is the three-way split the Status column draws, where `verified` is a grant that passed its latest check (one runs every hour) and `connected` narrows to one that has not passed a check yet, or whose latest check got a definite error back that was not a refusal. `order_by=connection_status` orders by the Status column's three states: disconnected first, then connected, then verified.",
        "operationId": "list_mailboxes",
        "parameters": [
          {
            "in": "query",
            "name": "connection_status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/MailboxConnectionStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The stored grant state. `connected` means anything that is not broken, which includes a grant nobody has checked yet."
            },
            "description": "The stored grant state. `connected` means anything that is not broken, which includes a grant nobody has checked yet."
          },
          {
            "in": "query",
            "name": "health",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/MailboxHealth"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The three-way split the Status column draws: `verified` passed its latest check, `connected` has not passed one yet or its latest check got a definite error back that was not a refusal, `disconnected` was refused."
            },
            "description": "The three-way split the Status column draws: `verified` passed its latest check, `connected` has not passed one yet or its latest check got a definite error back that was not a refusal, `disconnected` was refused."
          },
          {
            "in": "query",
            "name": "provider",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/MailboxProvider"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to one mail provider."
            },
            "description": "Narrow to one mail provider."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 320,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to addresses matching this text.",
              "title": "Search"
            },
            "description": "Narrow to addresses matching this text."
          },
          {
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to the mailboxes carrying one sender.",
              "title": "Sender Profile Id"
            },
            "description": "Narrow to the mailboxes carrying one sender."
          },
          {
            "in": "query",
            "name": "sent_on",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SentOn"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to mailboxes that sent on their sender's today or yesterday."
            },
            "description": "Narrow to mailboxes that sent on their sender's today or yesterday."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtEmailAddressProviderConnectionStatusSenderProfileId",
              "default": "email_address",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "email_address",
                "provider",
                "connection_status",
                "sender_profile_id"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          },
          {
            "description": "Sort worst configuration health to the top, with order_by as the secondary within-group sort. Disable to sort purely by order_by.",
            "in": "query",
            "name": "health_first",
            "required": false,
            "schema": {
              "default": true,
              "description": "Sort worst configuration health to the top, with order_by as the secondary within-group sort. Disable to sort purely by order_by.",
              "title": "Health First",
              "type": "boolean"
            }
          },
          {
            "description": "With health_first, which end of the health order comes first: worst_first (errors on top, the default) or best_first.",
            "in": "query",
            "name": "health_order",
            "required": false,
            "schema": {
              "default": "worst_first",
              "description": "With health_first, which end of the health order comes first: worst_first (errors on top, the default) or best_first.",
              "enum": [
                "worst_first",
                "best_first"
              ],
              "title": "Health Order",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_MailboxReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List mailboxes",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/authorize/": {
      "post": {
        "description": "Returns the Google authorize URL; the org rides in the OAuth state.",
        "operationId": "start_google_connect",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleConnectStartSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GoogleConnectStartResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Begin connecting a Google Workspace mailbox",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/bulk/": {
      "patch": {
        "description": "The daily send limit and sender-profile assignment across the selection. Omitted fields are left unchanged everywhere: 'leave unchanged' and 'set to empty' are different requests. Taking mailboxes off their sender, or moving them to another, also answers how many live contacts that stops or leaves waiting, per sequence: a contact is only ever emailed from the mailbox that first emailed them, so a mailbox taken off its sender makes them wait, and a move stops them in sequences the new sender is not on. The sender must be this workspace's own. With `dry_run` it answers the same and changes nothing.",
        "operationId": "bulk_update_mailboxes",
        "parameters": [
          {
            "description": "Report what would change, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would change, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MailboxBulkUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Edit many mailboxes at once",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/bulk/verify/": {
      "post": {
        "description": "Re-checks the given mailboxes, or every mailbox with `all` set to true, with the hourly check's own probe: a read of each account's profile, which sends no email. Each mailbox that passes is stamped last_verified_at, as the hourly check stamps it, and one whose grant is refused is marked disconnected with the reason. One Gmail answered with a definite error (Gmail turned off for that user, say) loses its stamp until a check passes. A mailbox disconnected on purpose, such as one removed from InboxKit, is not probed and is answered at its status. Answers the re-checked mailboxes at their status after the check in `data`, and apart from them, in `unreachable`, every mailbox the check could not reach (Google did not answer, a rate or quota limit, stored access that cannot be used), each at the status it had.",
        "operationId": "refresh_mailbox_status",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MailboxBulkVerifySchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxBulkVerifyResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Re-check mailbox connections now",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/callback/": {
      "post": {
        "description": "Exchanges the OAuth code and creates (or reconnects) the mailbox.",
        "operationId": "google_connect_callback",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleConnectCallbackSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "The person did not grant send and read access."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The OAuth state is invalid or expired."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "Google rejected the token exchange."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Finish connecting a Google Workspace mailbox",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/inboxkit/connection/": {
      "delete": {
        "description": "Removes the InboxKit connection; the presence poll stops covering the mailboxes it imported. They keep working unless `mailbox_action` says otherwise: `disconnect` keeps them but stops them sending, `delete` removes them with their inbox history. Either choice also clears the domain authorizations. Answers how many mailboxes were disconnected, deleted, or already gone. With `dry_run` it answers the same and removes nothing.",
        "operationId": "disconnect_inboxkit",
        "parameters": [
          {
            "description": "What to do with the mailboxes InboxKit imported. Leave it out to keep them working.",
            "in": "query",
            "name": "mailbox_action",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/MailboxRemovalAction"
                },
                {
                  "type": "null"
                }
              ],
              "description": "What to do with the mailboxes InboxKit imported. Leave it out to keep them working.",
              "title": "Mailbox Action"
            }
          },
          {
            "description": "Report what would be removed, and remove nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be removed, and remove nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InboxkitDisconnectedSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Disconnect InboxKit",
        "tags": [
          "senders"
        ]
      },
      "get": {
        "description": "Always 200: not-connected is a state the UI branches on, not an error.",
        "operationId": "get_inboxkit_connection",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InboxkitConnectionStatusSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the InboxKit connection state",
        "tags": [
          "senders"
        ]
      },
      "patch": {
        "description": "Toggles for the hourly sweep: auto-import new inboxes, auto-disconnect missing ones.",
        "operationId": "update_inboxkit_connection",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InboxkitConnectionUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InboxkitConnectionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update InboxKit automation settings",
        "tags": [
          "senders"
        ]
      },
      "put": {
        "description": "Stores the API key scoped to one workspace the key can act on, replacing the connection the workspace has.",
        "operationId": "connect_inboxkit",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InboxkitConnectSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InboxkitConnectionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "InboxKit rejected the API key."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "InboxKit could not be reached."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Connect InboxKit",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/inboxkit/connection/preview/": {
      "post": {
        "description": "Nothing is stored; the workspaces feed the connect picker.",
        "operationId": "preview_inboxkit_connect",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InboxkitConnectPreviewSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InboxkitConnectPreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "InboxKit rejected the API key."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "InboxKit could not be reached."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Validate an InboxKit API key and list its workspaces",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/inboxkit/domains/": {
      "get": {
        "description": "The authorization progress surface: per-domain status and failure reasons, one row per domain the workspace imports from, by domain name.",
        "operationId": "list_inboxkit_domains",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForDomainName",
              "default": "domain_name",
              "enum": [
                "domain_name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_InboxkitDomainReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List domain delegation states",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/inboxkit/imports/": {
      "get": {
        "description": "The import history: every request, who triggered it, and its per-mailbox counts.",
        "operationId": "list_inboxkit_imports",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtStartedAt",
              "default": "started_at",
              "enum": [
                "id",
                "created_at",
                "started_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_InboxkitImportRunReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List InboxKit import runs",
        "tags": [
          "senders"
        ]
      },
      "post": {
        "description": "Starts an import run for the chosen mailboxes. Mailboxes on authorized domains connect immediately; other domains start the async delegation handshake and import on completion. Answers the run to follow.",
        "operationId": "import_inboxkit_mailboxes",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InboxkitImportSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InboxkitImportResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "InboxKit rejected the API key."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "InboxKit could not be reached."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Import selected InboxKit mailboxes",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/inboxkit/imports/{run_id}/": {
      "get": {
        "description": "The run plus every requested mailbox and its outcome, failure reasons included.",
        "operationId": "get_inboxkit_import",
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InboxkitImportRunDetailReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get one InboxKit import run",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/inboxkit/inventory/": {
      "get": {
        "description": "Every InboxKit domain and mailbox, by domain name, merged with delegation state and which mailboxes are already connected here, marked imported: the import picker's data. A mailbox imported before and disconnected since is not marked, so it can be imported again. Paged by domain: page on with `next_page_cursor`; each page reads InboxKit's listing afresh.",
        "operationId": "get_inboxkit_inventory",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForDomainName",
              "default": "domain_name",
              "enum": [
                "domain_name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_InboxkitInventoryDomainReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "InboxKit rejected the API key."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "InboxKit could not be reached."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the org's InboxKit inventory",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/length/": {
      "get": {
        "description": "How many mailboxes match the filters the list takes.",
        "operationId": "get_mailboxes_count",
        "parameters": [
          {
            "description": "Narrow to addresses matching this text.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 320,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to addresses matching this text.",
              "title": "Search"
            }
          },
          {
            "description": "The stored grant state. `connected` means anything that is not broken, which includes a grant nobody has checked yet.",
            "in": "query",
            "name": "connection_status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/MailboxConnectionStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The stored grant state. `connected` means anything that is not broken, which includes a grant nobody has checked yet.",
              "title": "Connection Status"
            }
          },
          {
            "description": "The three-way split the Status column draws: `verified` passed its latest check, `connected` has not passed one yet or its latest check got a definite error back that was not a refusal, `disconnected` was refused.",
            "in": "query",
            "name": "health",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/MailboxHealth"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The three-way split the Status column draws: `verified` passed its latest check, `connected` has not passed one yet or its latest check got a definite error back that was not a refusal, `disconnected` was refused.",
              "title": "Health"
            }
          },
          {
            "description": "Narrow to one mail provider.",
            "in": "query",
            "name": "provider",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/MailboxProvider"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to one mail provider.",
              "title": "Provider"
            }
          },
          {
            "description": "Narrow to the mailboxes carrying one sender.",
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to the mailboxes carrying one sender.",
              "title": "Sender Profile Id"
            }
          },
          {
            "description": "Narrow to mailboxes that sent on their sender's today or yesterday.",
            "in": "query",
            "name": "sent_on",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SentOn"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to mailboxes that sent on their sender's today or yesterday.",
              "title": "Sent On"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count mailboxes",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/overview/": {
      "get": {
        "description": "Fleet size, health split, volume today/yesterday, and the workspace capacity left today.",
        "operationId": "get_mailbox_overview",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxOverviewReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Mailbox overview tiles",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/{mailbox_id}/": {
      "delete": {
        "description": "Deletes the mailbox and its usage history. With `dry_run` it answers the same and deletes nothing. To see who deleting it stops first, dry-run the delete of many.",
        "operationId": "delete_mailbox",
        "parameters": [
          {
            "in": "path",
            "name": "mailbox_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mailbox Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a mailbox",
        "tags": [
          "senders"
        ]
      },
      "get": {
        "operationId": "get_mailbox",
        "parameters": [
          {
            "in": "path",
            "name": "mailbox_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mailbox Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a mailbox",
        "tags": [
          "senders"
        ]
      },
      "patch": {
        "description": "A mailbox's own settings: its daily send limit and which sender it sends as. Name and signature live on the sender, which must be this workspace's own.",
        "operationId": "update_mailbox",
        "parameters": [
          {
            "in": "path",
            "name": "mailbox_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mailbox Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MailboxUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a mailbox",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/{mailbox_id}/activity/": {
      "get": {
        "description": "The detail page's chart: zero-filled per day, three disjoint counts, and the recipient domains mail went to, busiest first. `days` scopes both; 365 is the 'all' the UI offers. The bounces themselves, one row each, are `GET /mailboxes/{mailbox_id}/bounces/` over the same `days`.",
        "operationId": "get_mailbox_activity",
        "parameters": [
          {
            "in": "path",
            "name": "mailbox_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mailbox Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 14,
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxActivityReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "A mailbox's recent sends, replies and bounces",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/{mailbox_id}/bounces/": {
      "get": {
        "description": "Every message that bounced back to the mailbox in the last `days` days, the newest first, paged by cursor: the address it was for and how hard it bounced. `days` is the activity chart's window.",
        "operationId": "list_mailbox_bounces",
        "parameters": [
          {
            "in": "path",
            "name": "mailbox_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mailbox Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 14,
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForAt",
              "default": "at",
              "enum": [
                "at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_MailboxBounceSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a mailbox's bounces",
        "tags": [
          "senders"
        ]
      }
    },
    "/mailboxes/{mailbox_id}/verify/": {
      "post": {
        "description": "Checks that a mailbox's connection to Google still works by reading the account's own profile, refreshing the access token first if it needs it. Sends no email. A mailbox that passes is stamped last_verified_at, as the hourly check and a status refresh stamp it. A refused grant disconnects the mailbox, and the refusal carries the reason stored on it; so does a mailbox disconnected on purpose, which is not checked. A definite error Gmail answers with (Gmail turned off for that user, say) fails the check and clears the stamp, but leaves the mailbox connected. When Google cannot answer just now (no answer, a server error or a timeout), nothing is checked and the mailbox keeps the status it had.",
        "operationId": "verify_mailbox",
        "parameters": [
          {
            "in": "path",
            "name": "mailbox_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mailbox Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MailboxReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "The mailbox is disconnected, or Gmail answered with a definite error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Google could not answer, so nothing was checked."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Verify a mailbox's connection still works",
        "tags": [
          "senders"
        ]
      }
    },
    "/message-templates/": {
      "get": {
        "description": "The workspace's reusable email templates, newest-first. The built-in ones every workspace has for a sequence's email steps are `GET /message-templates/built-ins/`.",
        "operationId": "list_message_templates",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtName",
              "default": "created_at",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_MessageTemplateReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List saved email templates",
        "tags": [
          "sequences"
        ]
      },
      "post": {
        "description": "Save a drafted subject and body (as segments, so variables and AI/spintax tokens survive reuse) into the workspace library.",
        "operationId": "create_message_template",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MessageTemplateCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageTemplateReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Save an email template",
        "tags": [
          "sequences"
        ]
      }
    },
    "/message-templates/built-ins/": {
      "get": {
        "description": "The email templates we ship, the same in every workspace, for a sequence's email steps only: each a cold email that marks every line to write as a [blank] in brackets. The ones written to nudge an earlier email come last.",
        "operationId": "list_built_in_message_templates",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_BuiltInMessageTemplateReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the built-in email templates",
        "tags": [
          "sequences"
        ]
      }
    },
    "/message-templates/{template_id}/": {
      "delete": {
        "operationId": "delete_message_template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete an email template",
        "tags": [
          "sequences"
        ]
      },
      "patch": {
        "description": "Rename and/or move a template between composer scopes.",
        "operationId": "update_message_template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MessageTemplateUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageTemplateReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rename or re-scope an email template",
        "tags": [
          "sequences"
        ]
      }
    },
    "/notifications/preferences/": {
      "get": {
        "description": "Complete, with defaults filled in: a kind with no stored row is on.",
        "operationId": "list_notification_preferences",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationPreferencesSetSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "This user's notification switches",
        "tags": [
          "notifications"
        ]
      },
      "put": {
        "operationId": "put_notification_preferences",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationPreferencesPutSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationPreferencesSetSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update this user's notification switches",
        "tags": [
          "notifications"
        ]
      }
    },
    "/notifications/rules/": {
      "get": {
        "operationId": "list_notification_rules",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAt",
              "default": "created_at",
              "enum": [
                "id",
                "created_at",
                "updated_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_NotificationRuleReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List notification rules",
        "tags": [
          "notifications"
        ]
      },
      "post": {
        "description": "One trigger, one destination. Notifying both a Slack channel and a person is two rules. There is no 'notify nobody' rule: silence is the absence of one.",
        "operationId": "create_notification_rule",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationRuleCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationRuleReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "409": {
            "description": "No Slack workspace is connected."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a notification rule",
        "tags": [
          "notifications"
        ]
      }
    },
    "/notifications/rules/{rule_id}/": {
      "delete": {
        "operationId": "delete_notification_rule",
        "parameters": [
          {
            "in": "path",
            "name": "rule_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Rule Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a notification rule",
        "tags": [
          "notifications"
        ]
      }
    },
    "/notifications/slack/channels/": {
      "get": {
        "description": "The connected Slack workspace's public channels and the private ones the bot was added to, archived ones left out, read live from Slack a page at a time in Slack's own order, each page sorted by name. Slack may answer fewer than `limit` channels and still have more: read on with `next_page_cursor` until it is null. A cursor this list did not hand out answers 422 `invalid_cursor`.",
        "operationId": "list_slack_channels",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SlackChannelReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "409": {
            "description": "No Slack workspace is connected."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Channels the bot can post to",
        "tags": [
          "notifications"
        ]
      }
    },
    "/notifications/slack/connection/": {
      "delete": {
        "description": "Rules keep their channels, so reconnecting restores routing rather than rebuilding it.",
        "operationId": "disconnect_slack",
        "parameters": [
          {
            "description": "Report what would be disconnected, and disconnect nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be disconnected, and disconnect nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Disconnect Slack",
        "tags": [
          "notifications"
        ]
      },
      "get": {
        "operationId": "get_slack_connection",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SlackConnectionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No Slack workspace is connected."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "The organization's Slack connection",
        "tags": [
          "notifications"
        ]
      }
    },
    "/notifications/slack/connection/authorize/": {
      "post": {
        "operationId": "start_slack_connect",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SlackAuthorizeUrlSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "409": {
            "description": "Slack is not configured for this deployment."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Begin connecting a Slack workspace",
        "tags": [
          "notifications"
        ]
      }
    },
    "/notifications/slack/connection/callback/": {
      "post": {
        "operationId": "complete_slack_connect",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SlackCallbackSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SlackConnectionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The install could not be completed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Finish connecting a Slack workspace",
        "tags": [
          "notifications"
        ]
      }
    },
    "/notifications/slack/connections/": {
      "get": {
        "description": "The Slack workspace notifications post to, as a list: the one connected, or none before a workspace is connected. A workspace holds at most one.",
        "operationId": "list_slack_connections",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SlackConnectionReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the organization's Slack connections",
        "tags": [
          "notifications"
        ]
      }
    },
    "/onboarding/": {
      "get": {
        "description": "Get the organization's Getting started checklist as its last sync left it: six steps from the first people search to the first launched sequence, and what the pending steps link to today. Reading changes nothing. `POST /onboarding/sync/` starts the checklist and ticks the steps the workspace has done; the dashboard syncs as it opens, and progress is also brought up to date daily.",
        "operationId": "get_onboarding",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OnboardingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Nobody has opened the workspace yet, so it has no checklist."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the Getting started checklist",
        "tags": [
          "onboarding"
        ]
      },
      "patch": {
        "description": "Hide the checklist widget for the whole organization. Idempotent. The checklist stays readable and keeps tracking progress; only the sidebar stops showing it.",
        "operationId": "dismiss_onboarding",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OnboardingUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OnboardingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Hide the Getting started checklist",
        "tags": [
          "onboarding"
        ]
      }
    },
    "/onboarding/sync/": {
      "post": {
        "description": "Check the workspace for what the pending steps of the Getting started checklist ask for, complete the ones it finds and answer the checklist, so progress is right whether a step was done in the dashboard, through the API or from the Chrome extension. The first sync creates the checklist, and when the person calling made the workspace it also starts writing the business context from their company website. The dashboard calls this as it opens.",
        "operationId": "sync_onboarding",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OnboardingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Bring the Getting started checklist up to date",
        "tags": [
          "onboarding"
        ]
      }
    },
    "/outbound-agents/campaigns/": {
      "get": {
        "description": "The campaigns a new sequence starts from, each with its steps and their instructions: Email (`problem_first`) and Email and LinkedIn (`multichannel`). POST /sequences/ takes one as `campaign_key`.",
        "operationId": "list_outbound_campaigns",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutboundCampaignReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the campaign library",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/defaults/": {
      "get": {
        "description": "The configuration and the prompts a new outbound agent starts with (per email, per LinkedIn step and for replies), and whether person research can be switched on. The same in every workspace.",
        "operationId": "read_outbound_defaults",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundDefaultsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read what a new outbound agent starts with",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/preview-allowance/": {
      "get": {
        "description": "How many free previews the workspace may still write today, of its daily limit, and when the allowance starts again (the next midnight UTC). Writing a message to preview uses 1, one that researches the web 5, one that reads a LinkedIn profile 2, and a whole sequence written at once 1 more for each step after the first. Previews cost no credits. A preview is refused once it would use more than `remaining`.",
        "operationId": "read_preview_allowance",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundPreviewAllowanceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read today's preview allowance",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/prices/": {
      "get": {
        "description": "What one message costs on each model, in tenths of a credit: plain, with web research, and what reading a contact's LinkedIn profile adds. Read by the AI writing tab so the prices it quotes are the prices that are charged.",
        "operationId": "list_outbound_prices",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutboundPricePointReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List what each outbound agent model costs",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/": {
      "get": {
        "description": "One sequence's outbound agent: its goal, call to action, language, per-message prompts, reply prompt, model and research switch, with the version number an edit must be sent against.",
        "operationId": "get_outbound_agent_configuration",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundAgentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read an outbound agent",
        "tags": [
          "outbound-agents"
        ]
      },
      "patch": {
        "description": "Write a new version of the agent's configuration. The whole configuration is sent against the version it was read at; an edit against a stale version is refused so two people editing at once cannot silently overwrite each other.",
        "operationId": "update_outbound_agent",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutboundAgentUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundAgentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "409": {
            "description": "The agent changed since it was read."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change an outbound agent",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/conversations/": {
      "get": {
        "description": "Each contact the agent has written to: what it found out about them and every message it wrote them, oldest first, newest conversation first. subject_key narrows to one contact, by the key the sequence gave them; a contact nobody has written to has none.",
        "operationId": "list_outbound_conversations",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "subject_key",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the conversation with this contact, by the caller's key for them, e.g. sequence:<id>:record:<id>. A contact nobody has written to has none.",
              "title": "Subject Key"
            },
            "description": "Only the conversation with this contact, by the caller's key for them, e.g. sequence:<id>:record:<id>. A contact nobody has written to has none."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAt",
              "default": "created_at",
              "enum": [
                "id",
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutboundConversationReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the agent's conversations",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/conversations/{subject_key}/": {
      "get": {
        "description": "What the agent found out about one contact and every message it has written them, oldest first. The contact is named by the key the sequence gave it.",
        "operationId": "read_outbound_conversation",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "description": "The caller's key for the contact, e.g. sequence:<id>:record:<id>.",
            "in": "path",
            "name": "subject_key",
            "required": true,
            "schema": {
              "description": "The caller's key for the contact, e.g. sequence:<id>:record:<id>.",
              "maxLength": 255,
              "title": "Subject Key",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundConversationReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The agent was not found, or it has written nothing to this contact yet."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read one contact's conversation with the agent",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/conversations/{subject_key}/facts/{index}/": {
      "delete": {
        "description": "Remove a fact the research got wrong, so no later message to this contact is built on it. The rest of the research stays.",
        "operationId": "delete_outbound_research_fact",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "description": "The caller's key for the contact, e.g. sequence:<id>:record:<id>.",
            "in": "path",
            "name": "subject_key",
            "required": true,
            "schema": {
              "description": "The caller's key for the contact, e.g. sequence:<id>:record:<id>.",
              "maxLength": 255,
              "title": "Subject Key",
              "type": "string"
            }
          },
          {
            "description": "The fact's position in the research.",
            "in": "path",
            "name": "index",
            "required": true,
            "schema": {
              "description": "The fact's position in the research.",
              "minimum": 0,
              "title": "Index",
              "type": "integer"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Drop one fact from a contact's research",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/feedback/": {
      "get": {
        "description": "Every rating, note and rewrite people have given this agent's messages, newest first. Each is a record: what the agent learned is its learnings (`GET /agent-learnings/`).",
        "operationId": "list_outbound_feedback",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "message_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the feedback given on this message.",
              "title": "Message Id"
            },
            "description": "Only the feedback given on this message."
          },
          {
            "in": "query",
            "name": "source",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/FeedbackSource"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only feedback given in one place."
            },
            "description": "Only feedback given in one place."
          },
          {
            "in": "query",
            "name": "teaching_only",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only feedback that says something needs work: a thumbs down, a note or a rewrite. A Looks good alone, and approving a task, is left out. All of it is a record; the agent learns only from Needs work, through its learnings.",
              "title": "Teaching Only",
              "type": "boolean"
            },
            "description": "Only feedback that says something needs work: a thumbs down, a note or a rewrite. A Looks good alone, and approving a task, is left out. All of it is a record; the agent learns only from Needs work, through its learnings."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutboundFeedbackReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List what people told the agent",
        "tags": [
          "outbound-agents"
        ]
      },
      "post": {
        "description": "Record a thumb, a note, or both, as the person's record of what they read. It teaches nothing: the agent learns from Needs work, a thumbs down with a reason (`POST /agent-learnings/thumbs-downs/`), and from a person's edit (`POST /agent-learnings/hand-edits/`), each proposing a learning a person saves.",
        "operationId": "create_outbound_feedback",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutboundFeedbackCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundFeedbackReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rate one message the agent wrote",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/feedback/{feedback_id}/": {
      "delete": {
        "description": "Remove one of your own feedback records; the agent's learnings stay as they are.",
        "operationId": "delete_outbound_feedback",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "feedback_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Feedback Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "expected_updated_at",
            "required": true,
            "schema": {
              "format": "date-time",
              "title": "Expected Updated At",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "409": {
            "description": "The agent changed since it was read."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Undo your feedback",
        "tags": [
          "outbound-agents"
        ]
      },
      "patch": {
        "description": "Change only the signed-in author's feedback, refusing an older copy.",
        "operationId": "update_outbound_feedback",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "feedback_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Feedback Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutboundFeedbackUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundFeedbackReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "409": {
            "description": "The agent changed since it was read."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Edit your feedback",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/messages/{message_id}/": {
      "get": {
        "description": "One written message with everything shown beside it: the agent's own confidence and its reason, what it built the message on, and what the checks found.",
        "operationId": "get_outbound_message",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "message_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Message Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundMessageReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read one message the agent wrote",
        "tags": [
          "outbound-agents"
        ]
      },
      "patch": {
        "description": "Replace the words that will send. What the agent wrote is kept beside them. The edit is kept; a learning is proposed from it by `POST /agent-learnings/hand-edits/`. A message that has already gone out cannot be changed.",
        "operationId": "edit_outbound_message",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "message_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Message Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutboundMessageEditSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundMessageReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rewrite one message the agent wrote",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/messages/{message_id}/regenerate/": {
      "post": {
        "description": "Throw away the agent's words for one message and have it write them again, optionally with a note on what to change ('shorter', 'mention their new office'). A message in the sequence's cadence is rewritten in the background, at the message's usual price, and appears on the contact's conversation once written. A reply is rewritten straight away as a new draft that waits for approval in the inbox. Refused for a message that has already been sent, one the agent is writing right now, one waiting on a person in the approval queue unless `from_task` says the ask comes from that task (which is then cancelled), and a preview.",
        "operationId": "regenerate_outbound_message",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "message_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Message Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutboundMessageRegenerateSchema"
              }
            }
          }
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundMessageRegenerateReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Asked with an API key. Writing a message again spends the workspace's credits on somebody's say-so, so it takes a signed-in person."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The agent, the message, or the contact or inbox draft it was written for is gone."
          },
          "409": {
            "description": "The message cannot be written again now: it has been sent, the agent is already writing it, a person is reviewing it, or it is a preview. Or it is a reply on a conversation that is no longer in a sequence, which no agent writes. Or it is a reply the agent may not write now (already writing it, writing paused, its spending limit, not enough credits), and the detail says why; the reply stays as it was."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Have the agent write one message again",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/versions/": {
      "get": {
        "description": "Every configuration this agent has had, newest first, with what wrote each one: a person's edit, a revert, an accepted rewrite from feedback, or a copy.",
        "operationId": "list_outbound_agent_versions",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutboundAgentVersionReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an outbound agent's versions",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/versions/{version}/changes/": {
      "get": {
        "operationId": "get_outbound_version_changes",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "version",
            "required": true,
            "schema": {
              "title": "Version",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "compare_to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Compare To"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundVersionChangesSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Compare a writing version",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outbound-agents/{agent_id}/versions/{version}/revert/": {
      "post": {
        "description": "Apply an earlier configuration as a NEW version, so the history stays linear and the revert itself can be undone.",
        "operationId": "revert_outbound_agent",
        "parameters": [
          {
            "in": "path",
            "name": "agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Agent Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "version",
            "required": true,
            "schema": {
              "title": "Version",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "expected_version",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Expected Version"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutboundAgentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Outbound agent not found."
          },
          "409": {
            "description": "The agent changed since it was read."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Revert an outbound agent to an earlier version",
        "tags": [
          "outbound-agents"
        ]
      }
    },
    "/outreach-tasks/": {
      "get": {
        "description": "One list across every channel: LinkedIn steps and emails, each waiting on a person, waiting on its channel, or settled. Newest first by default, the order the Tasks page opens in; order by `created_at` or `contact_label`, which sorts by the contact as the Tasks page's Contact column shows them (a LinkedIn profile address by its slug, letters in any case together, a task about nobody as the empty name). Waiting on a person (`pending`, the Tasks page's Open tab) by default; pass `status` (repeatable) for approved work still on its channel (`scheduled`, its Pending tab) or settled tasks, and narrow by channel, task kind, sender, sequence, how it ended (`outcome`; the failed steps are `status=cancelled&outcome=failed`), why it waits for a person (`ask_reason`), words in the contact or the subject (`search`) or how long it has been waiting. Our own LinkedIn reads of the account (the inbox, sent connection requests, new connections, one conversation) are left out unless `background_checks` asks for them. `rewrites=include` keeps a task the agent is writing again in its place until it comes back with the new words, and `rewrites=only` lists those alone. `GET /outreach-tasks/length/` counts the same filters. Every name the row shows (the sequence, the step, the sender, who decided) is resolved here, and every approved, finished or cancelled task says where its work stands (`progress`: queued with its expected start, running, held by the sending window, sent, failed and whether it can be retried).",
        "operationId": "list_outreach_tasks",
        "parameters": [
          {
            "in": "query",
            "name": "ask_reason",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/AskReason"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only tasks held for a person for one of these reasons (repeatable): the Tasks page's Why it needs approval. Omit for every reason.",
              "title": "Ask Reason"
            },
            "description": "Only tasks held for a person for one of these reasons (repeatable): the Tasks page's Why it needs approval. Omit for every reason."
          },
          {
            "in": "query",
            "name": "background_checks",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ActivityBackgroundChecks",
              "default": "hide",
              "description": "Our own LinkedIn reads of the sender's account (the inbox, sent connection requests, new connections, one conversation): approved by nobody, acting on nobody, so left out by default (`hide`); `include` lists them with the rest, `only` alone. Activity lists the ones that ran."
            },
            "description": "Our own LinkedIn reads of the sender's account (the inbox, sent connection requests, new connections, one conversation): approved by nobody, acting on nobody, so left out by default (`hide`); `include` lists them with the rest, `only` alone. Activity lists the ones that ran."
          },
          {
            "in": "query",
            "name": "channel",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/TaskChannel"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these channels; omit for every channel.",
              "title": "Channel"
            },
            "description": "Only these channels; omit for every channel."
          },
          {
            "in": "query",
            "name": "enrolment_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the tasks of these contacts, by their enrolment in a sequence; omit for everyone.",
              "title": "Enrolment Id"
            },
            "description": "Only the tasks of these contacts, by their enrolment in a sequence; omit for everyone."
          },
          {
            "in": "query",
            "name": "id__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave these tasks out (repeatable), whatever else they match: the ones a page has just decided while the decision is still on its way, so a page read meanwhile is a whole page of the rest and its cursors are cut on the rows it shows. Omit for none.",
              "title": "Id  Not"
            },
            "description": "Leave these tasks out (repeatable), whatever else they match: the ones a page has just decided while the decision is still on its way, so a page read meanwhile is a whole page of the rest and its cursors are cut on the rows it shows. Omit for none."
          },
          {
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these kinds: a LinkedIn action slug (`profile_view`, `connection_request`, \u2026), `email`, or `needs_human` (a Browser use run that needed a person). Omit for every kind.",
              "title": "Kind"
            },
            "description": "Only these kinds: a LinkedIn action slug (`profile_view`, `connection_request`, \u2026), `email`, or `needs_human` (a Browser use run that needed a person). Omit for every kind."
          },
          {
            "in": "query",
            "name": "outcome",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 32,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only tasks that ended with one of these words (repeatable): `failed`, `skipped`, `stopped`, `succeeded` and the like. The tasks that failed are `status=cancelled` with `outcome=failed`. Omit for however they ended.",
              "title": "Outcome"
            },
            "description": "Only tasks that ended with one of these words (repeatable): `failed`, `skipped`, `stopped`, `succeeded` and the like. The tasks that failed are `status=cancelled` with `outcome=failed`. Omit for however they ended."
          },
          {
            "in": "query",
            "name": "rewrites",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/TaskRewrites",
              "default": "hide",
              "description": "The tasks the agent is writing again after a Needs work, or another version. Meanwhile each reads `status` `cancelled`, `outcome` `regenerated`, and `progress.state` `writing` (or why the write waits), and the same task comes back `pending` with the new words. By default (`hide`) they are listed only where `status` asks for `cancelled`; `include` lists them in their place among the statuses asked for, `only` alone, whatever `status` says. Every other filter still applies. A task whose rewrite ended, its contact stopped or moved on, is not one of them, nor is one nobody can act on: paused, held (the sending window, a sender with no mailbox or LinkedIn account) or failed past a retry. It comes back when the engine asks again with the new words."
            },
            "description": "The tasks the agent is writing again after a Needs work, or another version. Meanwhile each reads `status` `cancelled`, `outcome` `regenerated`, and `progress.state` `writing` (or why the write waits), and the same task comes back `pending` with the new words. By default (`hide`) they are listed only where `status` asks for `cancelled`; `include` lists them in their place among the statuses asked for, `only` alone, whatever `status` says. Every other filter still applies. A task whose rewrite ended, its contact stopped or moved on, is not one of them, nor is one nobody can act on: paused, held (the sending window, a sender with no mailbox or LinkedIn account) or failed past a retry. It comes back when the engine asks again with the new words."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.",
              "title": "Search"
            },
            "description": "Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject."
          },
          {
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these senders; omit for everyone.",
              "title": "Sender Profile Id"
            },
            "description": "Only these senders; omit for everyone."
          },
          {
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these sequences; omit for all of them.",
              "title": "Sequence Id"
            },
            "description": "Only these sequences; omit for all of them."
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "description": "Only these statuses; repeat the parameter for several. Defaults to pending.",
              "items": {
                "$ref": "#/components/schemas/TaskStatus"
              },
              "title": "Status",
              "type": "array"
            },
            "description": "Only these statuses; repeat the parameter for several. Defaults to pending."
          },
          {
            "in": "query",
            "name": "waiting_since_before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only tasks that entered the queue before this instant, which is 'waiting longer than'. Read off when the task was created, not when its channel would run it. Omit for however long they have been here.",
              "title": "Waiting Since Before"
            },
            "description": "Only tasks that entered the queue before this instant, which is 'waiting longer than'. Read off when the task was created, not when its channel would run it. Omit for however long they have been here."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAtContactLabel",
              "default": "created_at",
              "enum": [
                "created_at",
                "contact_label"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutreachTaskReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the approval queue",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/activity/": {
      "get": {
        "description": "Activity: every email that went out as a sender (a sequence's email or a reply from the inbox) and every LinkedIn step that ran on their account, with who let it go, plus every task a person refused. Each row says how it ended (`outcome`: `sent`, `done`, `failed`, `skipped`, `already_pending`, `stopped`, or `not_sent` for a refusal) and how it was decided (`decision`: `approved` with the approver, `automatic` when no person decided, `rejected` with who refused it, `sent_by_person` for a reply a person wrote in the inbox, `not_recorded` for a LinkedIn step from before Activity whose approval was not kept), with `ask_reason` saying why it was held for a person first. Our own LinkedIn reads of the account (the inbox, sent connection requests, new connections, one conversation) act on nobody and are hidden unless `background_checks` asks for them; such a row says `background`. What a contact did (their email or LinkedIn message as it landed in the inbox, their accepting a connection request) reads outcome `received`, kind `message_received` or `connection_accepted`; `received` lists it too (`include`), leaves it out (`hide`) or lists it alone (`only`). An account's Activity matches its people's enrolments and their addresses and LinkedIn profiles, so a message outside any sequence is listed. Newest first by default; order by `occurred_at` or `contact_label`. Each page passes its own scope: `sender_profile_id` for a sender's Activity tab (with `channel=linkedin` for its LinkedIn steps alone), `mailbox_id` for a mailbox's page, `sequence_id` for a sequence's Activity tab, `account_key` for an account's Activity tab, and `received=hide` for the Tasks page's Completed tab, the whole workspace.",
        "operationId": "list_outreach_activity",
        "parameters": [
          {
            "in": "query",
            "name": "account_key",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 320,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what went to the people at this account (its key, such as `acme.com`, or a key merged into it), through any sequence; omit for everyone. Past 5,000 enrolments at the account, the newest are followed.",
              "title": "Account Key"
            },
            "description": "Only what went to the people at this account (its key, such as `acme.com`, or a key merged into it), through any sequence; omit for everyone. Past 5,000 enrolments at the account, the newest are followed."
          },
          {
            "in": "query",
            "name": "background_checks",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ActivityBackgroundChecks",
              "default": "hide",
              "description": "Our own LinkedIn reads of the sender's account: the inbox, the sent connection requests, the newest connections, one conversation. They act on nobody. `hide` (the default) leaves them out, `include` lists them with everything else, `only` lists them alone."
            },
            "description": "Our own LinkedIn reads of the sender's account: the inbox, the sent connection requests, the newest connections, one conversation. They act on nobody. `hide` (the default) leaves them out, `include` lists them with everything else, `only` lists them alone."
          },
          {
            "in": "query",
            "name": "channel",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/TaskChannel"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these channels (`email`, `linkedin`, `browser` for Browser use runs); omit for every one.",
              "title": "Channel"
            },
            "description": "Only these channels (`email`, `linkedin`, `browser` for Browser use runs); omit for every one."
          },
          {
            "in": "query",
            "name": "decision",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/ActivityDecision"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what was decided this way: `approved` (a person or an API key approved it before it went), `automatic` (no person decided: the rules let it go), `rejected` (a person refused it, so it never went), `sent_by_person` (a person wrote and sent it from the inbox), `not_recorded` (a LinkedIn step from before Activity whose approval was not kept).",
              "title": "Decision"
            },
            "description": "Only what was decided this way: `approved` (a person or an API key approved it before it went), `automatic` (no person decided: the rules let it go), `rejected` (a person refused it, so it never went), `sent_by_person` (a person wrote and sent it from the inbox), `not_recorded` (a LinkedIn step from before Activity whose approval was not kept)."
          },
          {
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 32,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these kinds: a LinkedIn action slug (`connection_request`, `send_message`, \u2026), `email` for a sequence's email, `reply` for a reply from the inbox, or `browser_use` for a Browser use run.",
              "title": "Kind"
            },
            "description": "Only these kinds: a LinkedIn action slug (`connection_request`, `send_message`, \u2026), `email` for a sequence's email, `reply` for a reply from the inbox, or `browser_use` for a Browser use run."
          },
          {
            "in": "query",
            "name": "mailbox_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only emails that left from these mailboxes; omit for every mailbox. LinkedIn steps have no mailbox, so a mailbox filter leaves them out.",
              "title": "Mailbox Id"
            },
            "description": "Only emails that left from these mailboxes; omit for every mailbox. LinkedIn steps have no mailbox, so a mailbox filter leaves them out."
          },
          {
            "in": "query",
            "name": "occurred_after",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what happened at or after this instant, with its timezone offset.",
              "title": "Occurred After"
            },
            "description": "Only what happened at or after this instant, with its timezone offset."
          },
          {
            "in": "query",
            "name": "occurred_before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what happened before this instant, with its timezone offset.",
              "title": "Occurred Before"
            },
            "description": "Only what happened before this instant, with its timezone offset."
          },
          {
            "in": "query",
            "name": "outcome",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/ActivityOutcome"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what ended this way: `sent` (an email the provider accepted, or a LinkedIn message, InMail or connection request that went out), `done` (a LinkedIn step that only acted on a profile), `failed`, `skipped`, `already_pending` (a connection request somebody had already sent), `stopped`, `not_sent` (refused), `needs_human` (a Browser use run that left its contact for a person).",
              "title": "Outcome"
            },
            "description": "Only what ended this way: `sent` (an email the provider accepted, or a LinkedIn message, InMail or connection request that went out), `done` (a LinkedIn step that only acted on a profile), `failed`, `skipped`, `already_pending` (a connection request somebody had already sent), `stopped`, `not_sent` (refused), `needs_human` (a Browser use run that left its contact for a person)."
          },
          {
            "in": "query",
            "name": "received",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ActivityReceived",
              "default": "hide",
              "description": "What contacts did, outcome `received`: a message from them as it landed in the inbox (kind `message_received`, email or LinkedIn) and the acceptance of our connection request (`connection_accepted`). `hide` (the default) leaves them out, as the Tasks page's Completed tab does; `include` lists them with what went out, as every other Activity page does; `only` lists them alone."
            },
            "description": "What contacts did, outcome `received`: a message from them as it landed in the inbox (kind `message_received`, email or LinkedIn) and the acceptance of our connection request (`connection_accepted`). `hide` (the default) leaves them out, as the Tasks page's Completed tab does; `include` lists them with what went out, as every other Activity page does; `only` lists them alone."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.",
              "title": "Search"
            },
            "description": "Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject."
          },
          {
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what went out as these senders; omit for every sender.",
              "title": "Sender Profile Id"
            },
            "description": "Only what went out as these senders; omit for every sender."
          },
          {
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what these sequences sent; omit for all of them.",
              "title": "Sequence Id"
            },
            "description": "Only what these sequences sent; omit for all of them."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForOccurredAtContactLabel",
              "default": "occurred_at",
              "enum": [
                "occurred_at",
                "contact_label"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutreachActivityReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such account."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List what went out as a sender",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/activity/length/": {
      "get": {
        "description": "How many Activity rows the same filters as the list select, for the page's total.",
        "operationId": "count_outreach_activity",
        "parameters": [
          {
            "description": "Only what went out as these senders; omit for every sender.",
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what went out as these senders; omit for every sender.",
              "title": "Sender Profile Id"
            }
          },
          {
            "description": "Only these channels (`email`, `linkedin`, `browser` for Browser use runs); omit for every one.",
            "in": "query",
            "name": "channel",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/TaskChannel"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these channels (`email`, `linkedin`, `browser` for Browser use runs); omit for every one.",
              "title": "Channel"
            }
          },
          {
            "description": "Only what was decided this way: `approved` (a person or an API key approved it before it went), `automatic` (no person decided: the rules let it go), `rejected` (a person refused it, so it never went), `sent_by_person` (a person wrote and sent it from the inbox), `not_recorded` (a LinkedIn step from before Activity whose approval was not kept).",
            "in": "query",
            "name": "decision",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/ActivityDecision"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what was decided this way: `approved` (a person or an API key approved it before it went), `automatic` (no person decided: the rules let it go), `rejected` (a person refused it, so it never went), `sent_by_person` (a person wrote and sent it from the inbox), `not_recorded` (a LinkedIn step from before Activity whose approval was not kept).",
              "title": "Decision"
            }
          },
          {
            "description": "Only what ended this way: `sent` (an email the provider accepted, or a LinkedIn message, InMail or connection request that went out), `done` (a LinkedIn step that only acted on a profile), `failed`, `skipped`, `already_pending` (a connection request somebody had already sent), `stopped`, `not_sent` (refused), `needs_human` (a Browser use run that left its contact for a person).",
            "in": "query",
            "name": "outcome",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/ActivityOutcome"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what ended this way: `sent` (an email the provider accepted, or a LinkedIn message, InMail or connection request that went out), `done` (a LinkedIn step that only acted on a profile), `failed`, `skipped`, `already_pending` (a connection request somebody had already sent), `stopped`, `not_sent` (refused), `needs_human` (a Browser use run that left its contact for a person).",
              "title": "Outcome"
            }
          },
          {
            "description": "Only these kinds: a LinkedIn action slug (`connection_request`, `send_message`, \u2026), `email` for a sequence's email, `reply` for a reply from the inbox, or `browser_use` for a Browser use run.",
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 32,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these kinds: a LinkedIn action slug (`connection_request`, `send_message`, \u2026), `email` for a sequence's email, `reply` for a reply from the inbox, or `browser_use` for a Browser use run.",
              "title": "Kind"
            }
          },
          {
            "description": "Only what these sequences sent; omit for all of them.",
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what these sequences sent; omit for all of them.",
              "title": "Sequence Id"
            }
          },
          {
            "description": "Only emails that left from these mailboxes; omit for every mailbox. LinkedIn steps have no mailbox, so a mailbox filter leaves them out.",
            "in": "query",
            "name": "mailbox_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only emails that left from these mailboxes; omit for every mailbox. LinkedIn steps have no mailbox, so a mailbox filter leaves them out.",
              "title": "Mailbox Id"
            }
          },
          {
            "description": "Only what went to the people at this account (its key, such as `acme.com`, or a key merged into it), through any sequence; omit for everyone. Past 5,000 enrolments at the account, the newest are followed.",
            "in": "query",
            "name": "account_key",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 320,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what went to the people at this account (its key, such as `acme.com`, or a key merged into it), through any sequence; omit for everyone. Past 5,000 enrolments at the account, the newest are followed.",
              "title": "Account Key"
            }
          },
          {
            "description": "Our own LinkedIn reads of the sender's account: the inbox, the sent connection requests, the newest connections, one conversation. They act on nobody. `hide` (the default) leaves them out, `include` lists them with everything else, `only` lists them alone.",
            "in": "query",
            "name": "background_checks",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ActivityBackgroundChecks",
              "default": "hide",
              "description": "Our own LinkedIn reads of the sender's account: the inbox, the sent connection requests, the newest connections, one conversation. They act on nobody. `hide` (the default) leaves them out, `include` lists them with everything else, `only` lists them alone."
            }
          },
          {
            "description": "What contacts did, outcome `received`: a message from them as it landed in the inbox (kind `message_received`, email or LinkedIn) and the acceptance of our connection request (`connection_accepted`). `hide` (the default) leaves them out, as the Tasks page's Completed tab does; `include` lists them with what went out, as every other Activity page does; `only` lists them alone.",
            "in": "query",
            "name": "received",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ActivityReceived",
              "default": "hide",
              "description": "What contacts did, outcome `received`: a message from them as it landed in the inbox (kind `message_received`, email or LinkedIn) and the acceptance of our connection request (`connection_accepted`). `hide` (the default) leaves them out, as the Tasks page's Completed tab does; `include` lists them with what went out, as every other Activity page does; `only` lists them alone."
            }
          },
          {
            "description": "Only what happened at or after this instant, with its timezone offset.",
            "in": "query",
            "name": "occurred_after",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what happened at or after this instant, with its timezone offset.",
              "title": "Occurred After"
            }
          },
          {
            "description": "Only what happened before this instant, with its timezone offset.",
            "in": "query",
            "name": "occurred_before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only what happened before this instant, with its timezone offset.",
              "title": "Occurred Before"
            }
          },
          {
            "description": "Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.",
              "title": "Search"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachActivityCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such account."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count what went out as a sender",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/activity/{activity_id}/": {
      "get": {
        "description": "One row of Activity, exactly as the list reads it: what went out (or was refused), as which sender, how it ended and who let it go. A link to one row opens it with this, whichever page of the list it sits on.",
        "operationId": "get_outreach_activity",
        "parameters": [
          {
            "in": "path",
            "name": "activity_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Activity Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachActivityReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Activity not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read one activity row",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/activity/{activity_id}/email/": {
      "get": {
        "description": "The email one row of a sender's activity sent, exactly as it left: its HTML part, the words, the signature and the opt-out footer, as the contact got them. Null for a LinkedIn row or a send from before the send kept its email.",
        "operationId": "get_outreach_activity_email",
        "parameters": [
          {
            "in": "path",
            "name": "activity_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Activity Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachActivityEmailReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read the email an activity row sent",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/bulk/approve/": {
      "post": {
        "description": "The queue's bulk approve, over the rows a person ticked. Each is approved exactly as it would be on its own (a LinkedIn step joining its sender's line), and a row that has moved on meanwhile is counted as skipped rather than failing the batch, because a selection goes stale while it is being read; so is a LinkedIn step LinkedIn cannot take now (the sender is not connected), which still waits. The answer says when the approved work is expected to run (`schedule`): per sender, when their LinkedIn steps start, how many wait for the daily reset and what stops them (no browser open, a limit); and whether the emails go now or when the sending window opens. Of the rows the person had opened (`opened_task_ids`), words the agent wrote that nobody changed are recorded as approved as written: their Looks good, kept as a record that saves no learning. A row whose message a Needs work rewrote is different: approving it saves the learning that Needs work proposed, as approving it alone does, and `saved_learnings` counts them. Through an API key it saves none and throws them away, as approving one alone does.",
        "operationId": "bulk_approve_outreach_tasks",
        "parameters": [
          {
            "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkApproveSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkDecisionResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Approve every ticked task",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/bulk/reject/": {
      "post": {
        "description": "The queue's bulk reject, over the rows a person ticked. Reject is about the person: as with a single rejection this is a judgement about the contact, not the step, and the engine stops each of them when it next sweeps. A note, when one is given, covers the batch and is kept on every row it settled; the Tasks page sends none. A rejection saves no learning: only Needs work does. Rows that are no longer waiting on a person are skipped.",
        "operationId": "bulk_reject_outreach_tasks",
        "parameters": [
          {
            "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRejectSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkDecisionResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Reject every ticked task",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/effective-approval/": {
      "get": {
        "description": "What one sender's channel actually does in one sequence, and which level said so. A page can then say 'this is the sender's own setting' rather than showing a value with no provenance. Two levels: the sender decides, and a sequence may only ever tighten it. Also answers how much email sends without a person approving it: for the sender when you pass `sender_profile_id`, and for the sequence as a whole plus each sender assigned to it when you pass `sequence_id`. Both ids are optional; with neither, the channel modes are the product defaults. Reads only: a sender's send mode is changed on the sender's own settings.",
        "operationId": "get_effective_approval",
        "parameters": [
          {
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Sender Profile Id"
            }
          },
          {
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Sequence Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EffectiveApprovalReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Resolve the approval mode that applies",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/events/": {
      "get": {
        "description": "Server-sent event stream of everything outreach in the workspace: the approval queue (`tasks_changed`), a sequence's contacts (`contacts_changed`, with the sequence), a sender's LinkedIn steps and browser (`linkedin_steps_changed`, with the account) and a company's account (`accounts_changed`, with its key). Every frame is a wake-up, never data: refetch the reads the kind names. `hello` on connect and `resync` after a gap mean refetch everything on screen.\n\nThe server closes the stream after a few minutes with a `reconnect` frame; open a fresh one. Comment heartbeats keep intermediaries from dropping an idle connection. Refused with 503 and `Retry-After` when the server is near its stream limit; keep polling until a retry succeeds.\n\nRequires Clerk authentication; API keys are rejected.",
        "operationId": "stream_outreach_events",
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachStreamEventSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of change events; each SSE frame's `data` is one event."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stream the workspace's outreach change events",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/length/": {
      "get": {
        "description": "How many tasks the list's filters select, for the Tasks page's total, and the reasons the tasks every other filter selects wait for a person, for its Why it needs approval filter. Takes exactly the list's filters.",
        "operationId": "count_listed_outreach_tasks",
        "parameters": [
          {
            "description": "Only these statuses; repeat the parameter for several. Defaults to pending.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "description": "Only these statuses; repeat the parameter for several. Defaults to pending.",
              "items": {
                "$ref": "#/components/schemas/TaskStatus"
              },
              "title": "Status",
              "type": "array"
            }
          },
          {
            "description": "Only these channels; omit for every channel.",
            "in": "query",
            "name": "channel",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/TaskChannel"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these channels; omit for every channel.",
              "title": "Channel"
            }
          },
          {
            "description": "Only these kinds: a LinkedIn action slug (`profile_view`, `connection_request`, \u2026), `email`, or `needs_human` (a Browser use run that needed a person). Omit for every kind.",
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these kinds: a LinkedIn action slug (`profile_view`, `connection_request`, \u2026), `email`, or `needs_human` (a Browser use run that needed a person). Omit for every kind.",
              "title": "Kind"
            }
          },
          {
            "description": "Only these senders; omit for everyone.",
            "in": "query",
            "name": "sender_profile_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these senders; omit for everyone.",
              "title": "Sender Profile Id"
            }
          },
          {
            "description": "Only these sequences; omit for all of them.",
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only these sequences; omit for all of them.",
              "title": "Sequence Id"
            }
          },
          {
            "description": "Only the tasks of these contacts, by their enrolment in a sequence; omit for everyone.",
            "in": "query",
            "name": "enrolment_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the tasks of these contacts, by their enrolment in a sequence; omit for everyone.",
              "title": "Enrolment Id"
            }
          },
          {
            "description": "Only tasks that entered the queue before this instant, which is 'waiting longer than'. Read off when the task was created, not when its channel would run it. Omit for however long they have been here.",
            "in": "query",
            "name": "waiting_since_before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only tasks that entered the queue before this instant, which is 'waiting longer than'. Read off when the task was created, not when its channel would run it. Omit for however long they have been here.",
              "title": "Waiting Since Before"
            }
          },
          {
            "description": "Only tasks that ended with one of these words (repeatable): `failed`, `skipped`, `stopped`, `succeeded` and the like. The tasks that failed are `status=cancelled` with `outcome=failed`. Omit for however they ended.",
            "in": "query",
            "name": "outcome",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "maxLength": 32,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only tasks that ended with one of these words (repeatable): `failed`, `skipped`, `stopped`, `succeeded` and the like. The tasks that failed are `status=cancelled` with `outcome=failed`. Omit for however they ended.",
              "title": "Outcome"
            }
          },
          {
            "description": "Only tasks held for a person for one of these reasons (repeatable): the Tasks page's Why it needs approval. Omit for every reason.",
            "in": "query",
            "name": "ask_reason",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/AskReason"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only tasks held for a person for one of these reasons (repeatable): the Tasks page's Why it needs approval. Omit for every reason.",
              "title": "Ask Reason"
            }
          },
          {
            "description": "Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.",
              "title": "Search"
            }
          },
          {
            "description": "Our own LinkedIn reads of the sender's account (the inbox, sent connection requests, new connections, one conversation): approved by nobody, acting on nobody, so left out by default (`hide`); `include` lists them with the rest, `only` alone. Activity lists the ones that ran.",
            "in": "query",
            "name": "background_checks",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ActivityBackgroundChecks",
              "default": "hide",
              "description": "Our own LinkedIn reads of the sender's account (the inbox, sent connection requests, new connections, one conversation): approved by nobody, acting on nobody, so left out by default (`hide`); `include` lists them with the rest, `only` alone. Activity lists the ones that ran."
            }
          },
          {
            "description": "The tasks the agent is writing again after a Needs work, or another version. Meanwhile each reads `status` `cancelled`, `outcome` `regenerated`, and `progress.state` `writing` (or why the write waits), and the same task comes back `pending` with the new words. By default (`hide`) they are listed only where `status` asks for `cancelled`; `include` lists them in their place among the statuses asked for, `only` alone, whatever `status` says. Every other filter still applies. A task whose rewrite ended, its contact stopped or moved on, is not one of them, nor is one nobody can act on: paused, held (the sending window, a sender with no mailbox or LinkedIn account) or failed past a retry. It comes back when the engine asks again with the new words.",
            "in": "query",
            "name": "rewrites",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/TaskRewrites",
              "default": "hide",
              "description": "The tasks the agent is writing again after a Needs work, or another version. Meanwhile each reads `status` `cancelled`, `outcome` `regenerated`, and `progress.state` `writing` (or why the write waits), and the same task comes back `pending` with the new words. By default (`hide`) they are listed only where `status` asks for `cancelled`; `include` lists them in their place among the statuses asked for, `only` alone, whatever `status` says. Every other filter still applies. A task whose rewrite ended, its contact stopped or moved on, is not one of them, nor is one nobody can act on: paused, held (the sending window, a sender with no mailbox or LinkedIn account) or failed past a retry. It comes back when the engine asks again with the new words."
            }
          },
          {
            "description": "Leave these tasks out (repeatable), whatever else they match: the ones a page has just decided while the decision is still on its way, so a page read meanwhile is a whole page of the rest and its cursors are cut on the rows it shows. Omit for none.",
            "in": "query",
            "name": "id__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave these tasks out (repeatable), whatever else they match: the ones a page has just decided while the decision is still on its way, so a page read meanwhile is a whole page of the rest and its cursors are cut on the rows it shows. Omit for none.",
              "title": "Id  Not"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskLengthSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count the approval queue",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/summary/": {
      "get": {
        "description": "`pending` is the nav badge: tasks waiting on a person. Scheduled work is waiting on a channel, and a badge that counted it would nag about things nobody can act on. `failed_retryable` counts the failed LinkedIn steps whose contact can still be retried, which the AI Assistant's reading of the queue reports; it is not part of the badge.",
        "operationId": "count_outreach_tasks",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count what is waiting on a person",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/{task_id}/": {
      "get": {
        "operationId": "get_outreach_task",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read one task",
        "tags": [
          "outreach"
        ]
      },
      "patch": {
        "description": "Change what a pending task will send before approving it. An email's rewrite is stored as the contact's message override; a LinkedIn note or message is kept on the task as typed, and clipped to LinkedIn's ceilings when the approved step is queued, the way the step's own render would be. Only while the task is pending: once the channel has it, the text a person saw is the text that sends. With `expected_message_id`, an edit over a message written again since it was read is refused with 409.",
        "operationId": "edit_outreach_task",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutreachTaskEditSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The task is no longer in a state this decision applies to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The task carries no message to edit."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rewrite a pending task's message",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/{task_id}/approve/": {
      "post": {
        "description": "Let a pending task run, and record who said so. An approved LinkedIn step joins its sender's line, and whichever browser holds the lease performs it in turn: a reply at once, a sequence's step through the send engine, which holds it while its sequence or contact is paused. An approved email is sent at once, or when its sequence's sending window opens. The answer is the task's row plus `schedule`, the same forecast the bulk approve gives: when the step is expected to run and what would stop it. 409 when the task is no longer pending, or when its step cannot be taken now (the sender's LinkedIn is not connected, the connection request it would withdraw is no longer pending, the send engine could not take a sequence's step just now); the task then still waits. When the person opened the task first (`opened`), words the agent wrote that nobody changed are recorded as approved as written: their Looks good, kept as a record. A person's approval saves the learning a Needs work on the card proposed (`proposed_learning_event_id`), and is refused with 409 while that Needs work's rewrite is still being written, or, with `rev`, when the card's feedback session moved on since it was read. The learning is left unsaved when its list is full while the approval stands: `saved_learnings` says whether it was saved. An approval through an API key is no person's: it saves no learning, and throws away the one that Needs work proposed.",
        "operationId": "approve_outreach_task",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/OutreachTaskApproveSchema"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskApprovalReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The task is no longer in a state this decision applies to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Approve a task",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/{task_id}/complete/": {
      "post": {
        "description": "Say a person handled what a Browser use run could not (a task whose `channel` is `browser`). It leaves the Open tab and changes nothing about the contact, who already went on down the Needs human arm. 409 when it is already done or was withdrawn with its sequence; 422 for any other task, which is approved or rejected instead.",
        "operationId": "complete_outreach_task",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The task is no longer in a state this decision applies to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The task is not a Needs human task."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Mark a Needs human task done",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/{task_id}/email/": {
      "get": {
        "description": "What the card's email carries besides its words, so the card can show it whole as the contact gets it: for a card still to go, the signature and opt-out footer the send adds below the words (the footer's link unsubscribes nobody); once it went, its HTML part exactly as it left. Both null for a LinkedIn task.",
        "operationId": "get_outreach_task_email",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskEmailReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read an email card's email beyond its words",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/{task_id}/reject/": {
      "post": {
        "description": "Refuse a pending task, and record who did. Reject is about the person: this is a judgement about the contact, not the step, and the engine stops them in the sequence when it next sweeps. A LinkedIn step waiting on a person was never queued, so no browser runs it. The note, optional, is about the person, is kept on the task and saves no learning: only Needs work does. The Tasks page sends none.",
        "operationId": "reject_outreach_task",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the decision would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutreachTaskRejectSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The task is no longer in a state this decision applies to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Reject a task",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/{task_id}/thread/": {
      "get": {
        "description": "The follow-ups the agent drafted for the contact after the card's own email, in the order they go, with each step's wait. One approval covers the thread: approving the card approves each of these to send as written when its turn comes, with no card of its own; rejecting the card stops the contact. Empty for a LinkedIn task and an email nothing was drafted after.",
        "operationId": "get_outreach_task_thread",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutreachTaskThreadEmailSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read the rest of an email card's thread",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/{task_id}/thread/emails/{step_id}/": {
      "patch": {
        "description": "Change what one follow-up on a pending email card will send, before approving the card. A signed in person's edit is recorded as theirs, like an edit of the card's own email; one through an API key is nobody's. The edit is kept; a learning is proposed from it by `POST /agent-learnings/hand-edits/`. The follow-ups after it stay as they are. Answers with the follow-up as it now stands. 409 once the card is decided: the words a person approved are the words that send.",
        "operationId": "edit_outreach_task_thread_email",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutreachTaskThreadEditSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OutreachTaskThreadEmailSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The task is no longer in a state this decision applies to."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rewrite a follow-up on a pending email card",
        "tags": [
          "outreach"
        ]
      }
    },
    "/outreach-tasks/{task_id}/thread/later-steps/": {
      "get": {
        "description": "The steps after the card's own email whose words the agent writes only when the contact reaches them, in the sequence's order: an email, a LinkedIn message or InMail, or a connection request's note on a branch the agent does not draft ahead, such as an accepted connection request or a check's Yes branch. The card cannot show their words yet, and approving it does not approve them: each is written when the contact gets there, and asks on its own if its approval says so. A step already written for the contact is in the thread instead. Empty for a LinkedIn task, an email a person wrote, and a card rejected or withdrawn.",
        "operationId": "list_outreach_task_later_steps",
        "parameters": [
          {
            "in": "path",
            "name": "task_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Task Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_OutreachTaskLaterStepSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Task not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the messages the agent writes later for an email card's contact",
        "tags": [
          "outreach"
        ]
      }
    },
    "/referrals/": {
      "get": {
        "description": "The friends who joined through this workspace's link, newest first.",
        "operationId": "list_referrals",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ReferralStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to friends still on a free plan, or only those on a paid plan. The two are disjoint; omit for everything."
            },
            "description": "Narrow to friends still on a free plan, or only those on a paid plan. The two are disjoint; omit for everything."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdSignedUpAtCreatedAt",
              "default": "signed_up_at",
              "enum": [
                "id",
                "signed_up_at",
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ReferralReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List referrals",
        "tags": [
          "referral"
        ]
      }
    },
    "/referrals/claim/": {
      "post": {
        "description": "Attribute the caller's workspace to a referral code and pay the signup rewards. Safe to call repeatedly and never an error: a code that does not apply reports `attributed: false`. Requires a signed-in user rather than an API key: the claim records who signed up, and an API key has no person behind it. Pass `dry_run=true` to see what the claim would answer without recording it.",
        "operationId": "claim_referral",
        "parameters": [
          {
            "description": "Report what the claim would do, and record nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what the claim would do, and record nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReferralClaimRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReferralClaimReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Claim a referral code",
        "tags": [
          "referral"
        ]
      }
    },
    "/referrals/length/": {
      "get": {
        "description": "How many referrals match the filter. The list is cursor-paginated and therefore cannot report a total itself, but the page shows an exact 'N of M', so the count is its own read.",
        "operationId": "get_referrals_count",
        "parameters": [
          {
            "description": "Narrow to friends still on a free plan, or only those on a paid plan. The two are disjoint; omit for everything.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ReferralStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to friends still on a free plan, or only those on a paid plan. The two are disjoint; omit for everything.",
              "title": "Status"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReferralCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count referrals",
        "tags": [
          "referral"
        ]
      }
    },
    "/referrals/program/": {
      "get": {
        "description": "What the program pays, for the signup page. Deliberately unauthenticated: the person who most needs to see it has no account yet. It returns the two amounts and nothing else: resolving a code to the workspace behind it would turn this into a way to enumerate customer names.",
        "operationId": "get_referral_program",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReferralProgramReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "summary": "Get the referral program's reward amounts",
        "tags": [
          "referral"
        ]
      }
    },
    "/referrals/summary/": {
      "get": {
        "description": "The workspace's shareable referral link, the three headline counts, and the reward amounts the explainer copy quotes. The referral code is minted on first read, so a workspace that never opens the page never gets one.",
        "operationId": "get_referral_summary",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReferralSummaryReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the workspace's referral summary",
        "tags": [
          "referral"
        ]
      }
    },
    "/sender-profiles/": {
      "delete": {
        "description": "Delete the selection in one statement. Their mailboxes stay connected, unassigned. Ids that no longer exist are skipped rather than failing the request; `count` reports what actually went. Refused, deleting nothing, when any of them is used by a sequence; the error names the sequences. With `dry_run` it answers the same, refusals included, and deletes nothing.",
        "operationId": "bulk_delete_sender_profiles",
        "parameters": [
          {
            "description": "Senders to delete",
            "in": "query",
            "name": "ids",
            "required": true,
            "schema": {
              "description": "Senders to delete",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "minItems": 1,
              "title": "Ids",
              "type": "array"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete many senders",
        "tags": [
          "senders"
        ]
      },
      "get": {
        "operationId": "list_sender_profiles",
        "parameters": [
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Narrow to senders whose name matches this text.",
              "title": "Search"
            },
            "description": "Narrow to senders whose name matches this text."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtName",
              "default": "name",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SenderProfileReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List senders",
        "tags": [
          "senders"
        ]
      },
      "post": {
        "description": "Creates a draft sender; it activates once a mailbox is attached.",
        "operationId": "create_sender_profile",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderProfileCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderProfileReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Add a sender",
        "tags": [
          "senders"
        ]
      }
    },
    "/sender-profiles/bulk/": {
      "patch": {
        "description": "The Senders list's bulk action: set the first name, last name or signature across the selection. Omitted fields are left unchanged everywhere: 'leave unchanged' and 'set to empty' are different requests. Setting both name halves across more than one sender is refused, because two senders cannot carry the same name; nothing is changed when it is. With `dry_run` it answers the same, refusals included, and changes nothing.",
        "operationId": "bulk_update_sender_profiles",
        "parameters": [
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderProfileBulkUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderProfileBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Edit many senders at once",
        "tags": [
          "senders"
        ]
      }
    },
    "/sender-profiles/{profile_id}/": {
      "delete": {
        "description": "Deletes the sender; its mailboxes survive, unassigned. Refused while a sequence uses it. With `dry_run` it answers the same, refusals included, and deletes nothing.",
        "operationId": "delete_sender_profile",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a sender",
        "tags": [
          "senders"
        ]
      },
      "get": {
        "operationId": "get_sender_profile",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderProfileReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a sender",
        "tags": [
          "senders"
        ]
      },
      "patch": {
        "description": "Change who a sender is and how their messages go out. The first name, last name and signature are the identity messages are sent as, and the display name follows the two names. The job title and booking link fill the {{Sender title}} and {{Sender booking link}} variables. `send_mode` decides whether the messages the agent writes for this sender go out on their own or wait for a person. `email_approval_mode` pins whether this sender's emails wait in the approval queue; null hands the choice back to the workspace default. Only a person signed in to Oneprofile can change the send mode, email approval, job title or booking link; an API key can change the name and signature. Only a workspace admin can choose Always send, and only with `confirm` set to true. Every change to the send mode, job title or booking link is recorded with who made it. A looser send mode releases the emails already waiting for approval that it alone held, on every sequence the sender is on, unless another sender on that sequence still asks.",
        "operationId": "update_sender_profile",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderProfileUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderProfileReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "The caller may not make this change: an API key changing the send mode, email approval, job title or booking link, or anyone but a workspace admin choosing Always send."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a sender",
        "tags": [
          "senders"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/actions/": {
      "get": {
        "description": "The sender's LinkedIn steps, the queue and the history in one list. The steps not over yet are `phase=queued`, `resuming` and `claimed`, in the order the governor will hand them out with `order_by=line` and `order_direction=asc`: the running steps, then the waiting ones with the sequences sharing the account taking turns, then the steps a paused sequence or paused contact holds, each marked `held`: the rows the extension's side panel renders. Past the first hundred, the rest follow by priority and oldest first. A browser is never handed a held step. The steps that ended are `phase=settled`, which is the default order (`activity_at`, newest first). Narrow either by kind and by outcome.",
        "operationId": "list_linkedin_actions",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "held",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "True for only the steps a paused sequence or paused contact holds out of the line, false for only the ones released. Both when left out.",
              "title": "Held"
            },
            "description": "True for only the steps a paused sequence or paused contact holds out of the line, false for only the ones released. Both when left out."
          },
          {
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LinkedInActionKind"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only steps of this kind."
            },
            "description": "Only steps of this kind."
          },
          {
            "in": "query",
            "name": "phase",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/LinkedInActionPhase"
                  },
                  "maxItems": 4,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only steps in these phases, repeating the parameter for several. `queued`, `resuming` and `claimed` are the steps not over yet (the queue); `settled` is the steps that ended (the history). Every phase when left out.",
              "title": "Phase"
            },
            "description": "Only steps in these phases, repeating the parameter for several. `queued`, `resuming` and `claimed` are the steps not over yet (the queue); `settled` is the steps that ended (the history). Every phase when left out."
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LinkedInActionStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only steps stored in this status. With `phase` too, a step must match both."
            },
            "description": "Only steps stored in this status. With `phase` too, a step must match both."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForActivityAtLineQueuedAtId",
              "default": "activity_at",
              "enum": [
                "activity_at",
                "line",
                "queued_at",
                "id"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LinkedInActionReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a sender's LinkedIn steps",
        "tags": [
          "linkedin"
        ]
      },
      "post": {
        "description": "Queues a single step against a profile you name, so the channel can be tried end to end without building a sequence and waiting for it to reach a LinkedIn step.\n\nIt is a REAL step, and asking for it is its approval: it joins the sender's line behind their outreach, with the same daily limits and credit as any step, and runs when their browser takes it. Its row on Tasks names whoever asked as its approver.\n\nOne of: a profile view, a connection request (its note up to 200 characters), a message, a withdrawal of the connection request pending to the profile, a follow, and a like of the person's latest post. An InMail is not offered: it spends the sender's own Premium credits. One step of each kind waits at a time.",
        "operationId": "queue_linkedin_test_action",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkedInTryStepSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInActionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "A Try step of this kind is already waiting or running. It shares the real line and the real daily limits, so one of each kind waits at a time."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The URL names no LinkedIn person or the sender's own profile, the kind cannot be queued, or a withdrawal was asked for with no connection request pending."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Try one LinkedIn step",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/actions/length/": {
      "get": {
        "description": "How many LinkedIn steps the sender has that match the filters of the list: the total behind the queue or the history.",
        "operationId": "get_linkedin_actions_count",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          },
          {
            "description": "Only steps of this kind.",
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LinkedInActionKind"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only steps of this kind.",
              "title": "Kind"
            }
          },
          {
            "description": "Only steps stored in this status. With `phase` too, a step must match both.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LinkedInActionStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only steps stored in this status. With `phase` too, a step must match both.",
              "title": "Status"
            }
          },
          {
            "description": "Only steps in these phases, repeating the parameter for several. `queued`, `resuming` and `claimed` are the steps not over yet (the queue); `settled` is the steps that ended (the history). Every phase when left out.",
            "in": "query",
            "name": "phase",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/LinkedInActionPhase"
                  },
                  "maxItems": 4,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only steps in these phases, repeating the parameter for several. `queued`, `resuming` and `claimed` are the steps not over yet (the queue); `settled` is the steps that ended (the history). Every phase when left out.",
              "title": "Phase"
            }
          },
          {
            "description": "True for only the steps a paused sequence or paused contact holds out of the line, false for only the ones released. Both when left out.",
            "in": "query",
            "name": "held",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "True for only the steps a paused sequence or paused contact holds out of the line, false for only the ones released. Both when left out.",
              "title": "Held"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInActionCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count a sender's LinkedIn steps",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/actions/{action_id}/cancel/": {
      "post": {
        "description": "Takes a step out of the line before any browser has it. Deliberately queued-only: a claimed step is already running in somebody's browser, and cancelling it here would leave the two surfaces disagreeing about what happened. Its row on Tasks reads stopped, and a sequence's contact moves on as its step's end says. Approving and rejecting a step happen on Tasks, before it is queued.",
        "operationId": "cancel_linkedin_action",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "action_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Action Id",
              "type": "string"
            }
          },
          {
            "description": "Report the step as the cancel would leave it, and cancel nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report the step as the cancel would leave it, and cancel nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInActionReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The step is no longer queued."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Cancel a queued LinkedIn step",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/connection/": {
      "delete": {
        "description": "Signs every connected browser out and stops all work. History, settings and queued steps are kept, so reconnecting the same LinkedIn account picks up where it left off. Browsers are told over the push channel at once, and 401 on their next call regardless. The connection token is replaced; read the connection again for the new one. Answers how many browsers it signs out and how many steps stay queued.",
        "operationId": "disconnect_linkedin",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be disconnected, and disconnect nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be disconnected, and disconnect nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInDisconnectResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Disconnect the sender's LinkedIn account",
        "tags": [
          "linkedin"
        ]
      },
      "get": {
        "description": "Returns whether a LinkedIn account is connected to this sender, and if so its live state: which browsers are connected and when each was last seen, today's usage against each ceiling, how much work is queued, and what the next step waits on and until when (the time between steps, a limit's reset). Not-connected is a normal state rather than a 404: for a signed-in person it carries the connection token they paste into the extension, minted on their first read. An API key never gets the token (it is null) and its read mints nothing.",
        "operationId": "get_linkedin_account",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInAccountStateSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sender not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read a sender's LinkedIn connection",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/connection/regenerate-token/": {
      "post": {
        "description": "Mints a new connection token and signs out every browser connected with the old one. For when the token was pasted somewhere it should not have been: the string AND every session it already produced stop working. Only a signed-in person is shown the new token; an API key gets null.",
        "operationId": "regenerate_linkedin_connection_token",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInAccountStateSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sender not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Replace the sender's connection token",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/events/": {
      "get": {
        "description": "Server-sent event stream of everything that moves on a sender's LinkedIn tab: a browser connecting or disconnecting, the approval setting changing, and steps being queued, skipped or cancelled, including when the person did it in the extension or in another window.\n\nEvery frame is a wake-up, never a source of truth: the client re-reads the sender's state on `hello` and on each signal, so a dropped frame costs one round trip and nothing more. This is the dashboard half of the channel the extension already has over `/linkedin/agent/events/`; the two carry the same signals.\n\nThe server closes the stream after a few minutes with a `reconnect` frame; open a fresh one. Comment heartbeats keep intermediaries from dropping an idle connection.\n\nRequires Clerk authentication; API keys are rejected.",
        "operationId": "stream_sender_linkedin_events",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInStreamEventSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of change events; each SSE frame's `data` is one event."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sender not found."
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stream a sender's LinkedIn changes",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/settings/": {
      "patch": {
        "description": "Sets the per-kind daily ceilings, the rolling weekly ones (null clears a kind's weekly limit; connection requests always keep one), the least time between two steps (`min_action_interval_seconds`, 60 to 3,600 seconds) and the sender's approval setting (`run_mode`): whether a person approves each LinkedIn step on Tasks before it is queued. Switching it to manual takes back the steps queued without asking that no browser has started; switching it to auto queues the ones only this setting held. The time between steps belongs to the LinkedIn account, not to a sequence: it holds across every sequence the account sends for. These are the controls that keep a customer's account out of trouble, so there is deliberately no way to disable the governor entirely, only to choose its numbers.",
        "operationId": "update_linkedin_settings",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkedInSettingsUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInAccountReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "A limit is above its maximum, or the time between steps is outside 60 to 3,600 seconds."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update LinkedIn safety settings",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/stats/": {
      "get": {
        "description": "Lifetime counts of the steps that ended, by how they ended, with their average duration: the header of the sender's history.",
        "operationId": "get_linkedin_stats",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInStatsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read a sender's LinkedIn step totals",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/table-steps/": {
      "get": {
        "description": "Each table column whose View a LinkedIn profile or Research company graph steps are in this sender's line, with how many wait for a browser and how many run in one now. Every step not over yet is counted, however long the line. The steps themselves are on the sender's actions list, each labelled with its table. Narrowed to one table, or one of its columns, by `table_id` and `column_id`.",
        "operationId": "list_linkedin_table_steps",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          },
          {
            "description": "Only the columns of this table.",
            "in": "query",
            "name": "table_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the columns of this table.",
              "title": "Table Id"
            }
          },
          {
            "description": "Only this table column.",
            "in": "query",
            "name": "column_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only this table column.",
              "title": "Column Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInTableStepsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count a sender's LinkedIn steps that tables queued",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/linkedin/table-steps/bulk/cancel/": {
      "post": {
        "description": "Takes every step one table column queued in this sender's line out of it before any browser has it, however many. The column is chosen by the From tables list's own filters, `table_id` and `column_id`, both required. A step a browser runs now finishes. Each cancelled step's cell reads Stopped, and the column's next run asks again. Answers how many steps were cancelled as `updated`.",
        "operationId": "cancel_linkedin_table_steps",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          },
          {
            "description": "Count the steps the cancel would take out, and cancel nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Count the steps the cancel would take out, and cancel nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkedInTableStepsBulkCancelSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkedInTableStepsBulkCancelResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No LinkedIn account for this sender."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Cancel a table column's queued LinkedIn steps",
        "tags": [
          "linkedin"
        ]
      }
    },
    "/sender-profiles/{profile_id}/mailboxes/": {
      "put": {
        "description": "Assigns exactly this set of mailboxes to the profile (the picker's save).",
        "operationId": "set_profile_mailboxes",
        "parameters": [
          {
            "in": "path",
            "name": "profile_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Profile Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SenderProfileMailboxesPutSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderProfileMailboxesSetSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Set a profile's mailboxes",
        "tags": [
          "senders"
        ]
      }
    },
    "/sequence-templates/": {
      "get": {
        "operationId": "list_sequence_templates",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtName",
              "default": "created_at",
              "enum": [
                "id",
                "created_at",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SequenceTemplateReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List reusable sequence templates",
        "tags": [
          "sequences"
        ]
      },
      "post": {
        "operationId": "save_sequence_template",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceTemplateCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceTemplateReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "A template with this name already exists."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Save a detached sequence template",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequence-templates/{template_id}/": {
      "delete": {
        "operationId": "delete_sequence_template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a template",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequence-templates/{template_id}/use/": {
      "post": {
        "description": "Makes a draft on the template's steps and settings. `folder_id` files it in a folder on the Sequences list; leave the body out for the top level.",
        "operationId": "instantiate_sequence_template",
        "parameters": [
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/SequenceTemplateUseSchema"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a draft from a template, with fresh audience and senders",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/": {
      "get": {
        "description": "Name, status, senders, and the rollup metrics (contacts, sent, reply rate) from the workspace's cached stats, served at once whatever their age. When they are more than five minutes old a refresh runs in the background. `GET /sequences/length/` says when the numbers were computed and whether a refresh is running: read both again a few seconds later for the newer numbers. Only a workspace whose stats have never been built waits for them. What holds a running sequence (hold, such as the tasks waiting for approval) is read live on every request, never from the cached stats, unless include_holds is false. Each sequence says whether the person asking starred it and when they last opened it: both are that person's own. `favorite` keeps only the sequences they starred; `recent` keeps only the ones they opened, the latest open first, at most 20, and answers them whole as one page. An API key has no person, so both read empty for it.\n\n`trashed` lists the sequences in Trash instead of the live ones, each with when it went there (`deleted_at`, which `order_by` sorts by too) and its audience table's name. Each can be restored (POST /sequences/{id}/restore/), or deleted for good early (DELETE /sequences/{id}/?permanently=true); otherwise Trash deletes it 30 days after it went there. One that went there with a folder is listed under the folder instead (GET /sequences/folders/?trashed=true), unless `with_folder_trash` asks for it too.\n\nEach sequence names the folder it is filed in (`folder_id`, with `folder_path` from the top level down). `folder_id` keeps only the sequences directly in one folder, and `top_level` only the ones in none; the folders themselves are listed by GET /sequences/folders/.",
        "operationId": "list_sequences",
        "parameters": [
          {
            "in": "query",
            "name": "favorite",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the sequences the person asking starred. Their own, never a teammate's; an API key has no person, so none.",
              "title": "Favorite",
              "type": "boolean"
            },
            "description": "Only the sequences the person asking starred. Their own, never a teammate's; an API key has no person, so none."
          },
          {
            "in": "query",
            "name": "folder_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the sequences filed directly in this folder.",
              "title": "Folder Id"
            },
            "description": "Only the sequences filed directly in this folder."
          },
          {
            "in": "query",
            "name": "include_holds",
            "required": false,
            "schema": {
              "default": true,
              "description": "Read what holds each running sequence. False leaves every `hold` empty and answers much faster: for a caller that needs only the sequences themselves, such as a picker.",
              "title": "Include Holds",
              "type": "boolean"
            },
            "description": "Read what holds each running sequence. False leaves every `hold` empty and answers much faster: for a caller that needs only the sequences themselves, such as a picker."
          },
          {
            "in": "query",
            "name": "recent",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the sequences the person asking opened, the latest open first, at most 20: a short list, answered whole as one page. An API key has no person, so none.",
              "title": "Recent",
              "type": "boolean"
            },
            "description": "Only the sequences the person asking opened, the latest open first, at most 20: a short list, answered whole as one page. An API key has no person, so none."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only sequences whose name holds this text, in any case.",
              "title": "Search"
            },
            "description": "Only sequences whose name holds this text, in any case."
          },
          {
            "in": "query",
            "name": "top_level",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the sequences in no folder, and any whose folder went to Trash, which the list shows at the top level.",
              "title": "Top Level",
              "type": "boolean"
            },
            "description": "Only the sequences in no folder, and any whose folder went to Trash, which the list shows at the top level."
          },
          {
            "in": "query",
            "name": "trashed",
            "required": false,
            "schema": {
              "default": false,
              "description": "The sequences in Trash instead of the live ones. Trash deletes each for good 30 days after it went there. One that went with a folder is listed under that folder (GET /sequences/folders/?trashed=true) instead.",
              "title": "Trashed",
              "type": "boolean"
            },
            "description": "The sequences in Trash instead of the live ones. Trash deletes each for good 30 days after it went there. One that went with a folder is listed under that folder (GET /sequences/folders/?trashed=true) instead."
          },
          {
            "in": "query",
            "name": "with_folder_trash",
            "required": false,
            "schema": {
              "default": false,
              "description": "With trashed: also the sequences that went to Trash with a folder, which Trash lists under that folder. Each names it in trashed_with_folder_id, and only the folder's restore brings it back.",
              "title": "With Folder Trash",
              "type": "boolean"
            },
            "description": "With trashed: also the sequences that went to Trash with a folder, which Trash lists under that folder. Each names it in trashed_with_folder_id, and only the folder's restore brings it back."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtDeletedAtName",
              "default": "created_at",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "deleted_at",
                "name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SequenceReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List sequences",
        "tags": [
          "sequences"
        ]
      },
      "post": {
        "description": "Creates a draft on the chosen starter, configured afterwards and checked at launch. With the ai starter, `campaign_key` picks the library campaign its steps are laid out from: `problem_first` (Email, the default three emails) or `multichannel` (Email and LinkedIn). The browser_use starter opens on one Browser use step with no goal yet. When the workspace has exactly one sender, it is added. `folder_id` files it in a folder on the Sequences list (GET /sequences/folders/). A `table_id` that lists companies, not people, is refused with that sentence (GET /sequences/audience-refusals/ names such tables).",
        "operationId": "create_sequence",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/analytics/leaderboard/": {
      "get": {
        "description": "Every mailbox's sent, reply and bounce numbers under its sender, worst performer first, so the one broken mailbox stands out. Served at once from the cached rollup, whatever its age; refreshed_at says how old. When it is more than five minutes old a refresh runs in the background and refreshing is true: read it again a few seconds later for the newer board.",
        "operationId": "get_sender_leaderboard",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SenderLeaderboardReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Sender leaderboard",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/analytics/summary/": {
      "get": {
        "description": "The funnel, the rates and a per-day series, for one sequence or the whole workspace. There is deliberately no open or click rate: we send plain text and there is nothing to instrument. A preset range is served at once from the workspace's cached stats, whatever their age; refreshed_at says when they were computed. When they are more than five minutes old a refresh runs in the background and refreshing is true: read them again a few seconds later for the newer numbers. A start or end window is computed live, with refreshed_at None.",
        "operationId": "get_sequence_analytics",
        "parameters": [
          {
            "in": "query",
            "name": "sequence_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Sequence Id"
            }
          },
          {
            "in": "query",
            "name": "range",
            "required": false,
            "schema": {
              "default": "all",
              "pattern": "^(all|week|month)$",
              "title": "Range",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "start",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Start"
            }
          },
          {
            "in": "query",
            "name": "end",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "End"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceAnalyticsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Outreach analytics",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/audience-refusals/": {
      "get": {
        "description": "Of the tables asked about, the ones a sequence cannot be pointed at, each with why: a table that lists companies, not people (a company table, or a table one of whose columns names each row's company and every other column describes it, none reaching a person by email, LinkedIn profile or name). Creating a sequence on one, or setting it as an audience, is refused with the same sentence. `company_column_id` is the column a people search follows to find the people at its companies. A table not asked about, not in this workspace, or that lists people is not listed.",
        "operationId": "list_audience_refusals",
        "parameters": [
          {
            "description": "The tables to judge, at most 100.",
            "in": "query",
            "name": "table_id",
            "required": true,
            "schema": {
              "description": "The tables to judge, at most 100.",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "title": "Table Id",
              "type": "array"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AudienceRefusalReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Name the tables a sequence cannot write to",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/bulk/": {
      "patch": {
        "description": "Put many sequences in a folder in one request (folder_id, null for the top level of the Sequences list). A placement only: a running sequence keeps running. Answers how many changed and which; one already there, missing or in Trash is left out.",
        "operationId": "bulk_update_sequences",
        "parameters": [
          {
            "description": "Report which sequences would change, and change none.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report which sequences would change, and change none.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceBulkUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change several sequences at once",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/column-mapping/suggestions/": {
      "get": {
        "operationId": "suggest_mapping",
        "parameters": [
          {
            "in": "query",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColumnMappingSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest a column mapping for a table",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/email-steps/suggestions/": {
      "get": {
        "description": "Reads a table's column names and suggests which hold a subject line, a first email and follow-ups, such as an Email writer's Subject, First email, Second email and Last email. Takes a table; returns column ids, any of them empty. Builds nothing: the steps are made when a sequence's graph is saved.",
        "operationId": "suggest_email_steps",
        "parameters": [
          {
            "in": "query",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailStepColumnsSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest email steps from a table's written emails",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/folders/": {
      "get": {
        "description": "Every live folder on the Sequences list, at every level, by name. parent_id says where each one sits. Each says how many sequences and folders it holds. Paged by cursor in that order: the list, the breadcrumb and the move picker read every page. The sequences in a folder are listed by GET /sequences/?folder_id=.\n\ntrashed lists the folders somebody moved to Trash instead, newest first, each with how many sequences and folders went with it, and how many of those sequences write to an audience table. A folder that went with its own parent is not listed.",
        "operationId": "list_sequence_folders",
        "parameters": [
          {
            "in": "query",
            "name": "trashed",
            "required": false,
            "schema": {
              "default": false,
              "description": "List the folders somebody moved to Trash instead of the live ones, newest first. A folder that went with its own parent is not listed.",
              "title": "Trashed",
              "type": "boolean"
            },
            "description": "List the folders somebody moved to Trash instead of the live ones, newest first. A folder that went with its own parent is not listed."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SequenceFolderSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List sequence folders",
        "tags": [
          "sequences"
        ]
      },
      "post": {
        "description": "Make a folder on the Sequences list, at the top level or inside parent_id. Leave the name out for \"Untitled folder\". Names are unique among a folder's live siblings, case aside.",
        "operationId": "create_sequence_folder",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceFolderCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceFolderSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Make a sequence folder",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/folders/suggestions/": {
      "get": {
        "description": "Group the live sequences on the list that sit in no folder by what they share: the same audience table, which names the folder (audience_table), a campaign code ending their names such as (EF-1) (campaign_code), or names that start the same up to a dash (shared_name). Each suggestion names a folder and two or more sequences, each sequence in one suggestion at most, biggest first. folder_id names a folder of that name already at the top level. Nothing is moved: file a suggestion by making its folder and moving its sequences into it. loose_sequence_count says how many sequences sit in no folder.",
        "operationId": "suggest_sequence_folders",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceFolderSuggestionsSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest folders for the sequences in no folder",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/folders/{folder_id}/": {
      "delete": {
        "description": "Move a folder to Trash with every folder and sequence in it, as Google Drive does. Each running sequence in it pauses and lets its contacts go, exactly as when it goes to Trash on its own; paused_count says how many. Trash lists the folder, and restoring it brings everything back together, paused. Trash keeps it for the same 30 days as a sequence.\n\npermanently destroys a folder that is already in Trash instead, with every folder and sequence that went there with it. That cannot be undone.",
        "operationId": "delete_sequence_folder",
        "parameters": [
          {
            "in": "path",
            "name": "folder_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Folder Id",
              "type": "string"
            }
          },
          {
            "description": "Destroy a folder already in Trash for good, instead of trashing it.",
            "in": "query",
            "name": "permanently",
            "required": false,
            "schema": {
              "default": false,
              "description": "Destroy a folder already in Trash for good, instead of trashing it.",
              "title": "Permanently",
              "type": "boolean"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceFolderDeletedResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a sequence folder",
        "tags": [
          "sequences"
        ]
      },
      "patch": {
        "description": "Rename a folder, or move it into another folder (parent_id, null for the top level) with everything in it. A folder cannot move inside itself or one of its own folders.",
        "operationId": "update_sequence_folder",
        "parameters": [
          {
            "in": "path",
            "name": "folder_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Folder Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceFolderUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceFolderSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rename or move a sequence folder",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/folders/{folder_id}/restore/": {
      "post": {
        "description": "Bring a folder back with every folder and sequence that went to Trash with it, where it was (the top level when its own folder is gone). Each launched sequence comes back paused, and only Resume starts it again; its contacts are taken back where they stood, in the background, unless another sequence took them meanwhile (contacts_held_elsewhere counts them). A sequence whose name a live sequence has taken since stays in Trash, listed there on its own, and the answer names it.",
        "operationId": "restore_sequence_folder",
        "parameters": [
          {
            "in": "path",
            "name": "folder_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Folder Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would come back, and restore nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would come back, and restore nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceFolderRestoreReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found in Trash."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Restore a sequence folder from Trash",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/length/": {
      "get": {
        "description": "How many sequences the list's filters match, and how fresh the rollup metrics on the list's rows are. stats_refreshed_at is when the numbers were computed; None only when they have never been built and could not be built on this request (for example, another request was building them). When they are more than five minutes old a refresh runs in the background and stats_refreshing is true: read the list and this count again a few seconds later for the newer numbers. Only a workspace whose stats have never been built waits for them.",
        "operationId": "count_sequences",
        "parameters": [
          {
            "description": "Only sequences whose name holds this text, in any case.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only sequences whose name holds this text, in any case.",
              "title": "Search"
            }
          },
          {
            "description": "Only the sequences the person asking starred. Their own, never a teammate's; an API key has no person, so none.",
            "in": "query",
            "name": "favorite",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the sequences the person asking starred. Their own, never a teammate's; an API key has no person, so none.",
              "title": "Favorite",
              "type": "boolean"
            }
          },
          {
            "description": "Only the sequences the person asking opened, the latest open first, at most 20: a short list, answered whole as one page. An API key has no person, so none.",
            "in": "query",
            "name": "recent",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the sequences the person asking opened, the latest open first, at most 20: a short list, answered whole as one page. An API key has no person, so none.",
              "title": "Recent",
              "type": "boolean"
            }
          },
          {
            "description": "The sequences in Trash instead of the live ones. Trash deletes each for good 30 days after it went there. One that went with a folder is listed under that folder (GET /sequences/folders/?trashed=true) instead.",
            "in": "query",
            "name": "trashed",
            "required": false,
            "schema": {
              "default": false,
              "description": "The sequences in Trash instead of the live ones. Trash deletes each for good 30 days after it went there. One that went with a folder is listed under that folder (GET /sequences/folders/?trashed=true) instead.",
              "title": "Trashed",
              "type": "boolean"
            }
          },
          {
            "description": "Only the sequences filed directly in this folder.",
            "in": "query",
            "name": "folder_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the sequences filed directly in this folder.",
              "title": "Folder Id"
            }
          },
          {
            "description": "Only the sequences in no folder, and any whose folder went to Trash, which the list shows at the top level.",
            "in": "query",
            "name": "top_level",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the sequences in no folder, and any whose folder went to Trash, which the list shows at the top level.",
              "title": "Top Level",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count sequences, with when their stats were computed",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/message/check/": {
      "post": {
        "description": "Rule-based findings on the given subject and body: risky phrases, link density, shouting, punctuation, length, and for an email the variables, emoji and blanks left from a starter, with what passes. The text is the composer's: {{Column}} is a variable and {{spin: a | b}} a rotation. Deterministic and free; pure text analysis, nothing is stored.",
        "operationId": "spam_check",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpamCheckRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpamCheckResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Check a drafted message for deliverability risks",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/spintax/suggestions/": {
      "post": {
        "description": "Per-sentence rewrite proposals (the original plus two alternatives) for the author to accept or reject: the composer's Suggest versions with AI. The draft itself is never modified. Variable tokens survive verbatim. A sentence that already rotates, holds a [blank] to fill or that the spam check flags gets none.",
        "operationId": "autospintax",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AutospintaxRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AutospintaxResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "description": "The model could not propose rotations right now."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Propose spintax rotations for a drafted message",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/": {
      "delete": {
        "description": "Move a sequence to Trash. A running one is paused first. Its contacts stop at once and are free for other sequences, and anything it had waiting for approval or queued on LinkedIn is withdrawn. Nothing else is lost: its steps, settings and history stay, and so do its status and messages columns on the audience table. Its name is freed at once.\n\nRestore it with POST /sequences/{id}/restore/; it comes back paused. Trash keeps it for 30 days, then deletes it for good, as `permanently` does at once.\n\n`permanently` deletes a sequence that is already in Trash for good: its steps, settings, every contact's progress, its agent, and its status and messages columns on the audience table. Its history is kept. This cannot be undone, and it only works on a sequence in Trash, so it is never the first thing that happens to a live one.\n\n`untouched` deletes a draft for good, without Trash, only while nothing at all was done to it since New sequence created it (with the contacts it enrolled from the table it was made on, which go with it). Any change keeps it: a step added, removed, moved or edited, a preview written, the audience, a sender, the name, or any setting, the sending window included. Any other sequence is left as it is and `count` is 0. The dashboard asks for that when someone returns from a new sequence without changing it.",
        "operationId": "delete_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Delete the sequence only while it is a draft nobody has done anything to since it was created, and keep any other.",
            "in": "query",
            "name": "untouched",
            "required": false,
            "schema": {
              "default": false,
              "description": "Delete the sequence only while it is a draft nobody has done anything to since it was created, and keep any other.",
              "title": "Untouched",
              "type": "boolean"
            }
          },
          {
            "description": "Delete a sequence that is already in Trash for good, instead of moving it there.",
            "in": "query",
            "name": "permanently",
            "required": false,
            "schema": {
              "default": false,
              "description": "Delete a sequence that is already in Trash for good, instead of moving it there.",
              "title": "Permanently",
              "type": "boolean"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Move a sequence to Trash",
        "tags": [
          "sequences"
        ]
      },
      "get": {
        "description": "A live sequence with its steps and edges. `trashed` reads one in Trash instead, with when it went there (`deleted_at`): what a link to a sequence that answers 404 \"Sequence is in Trash\" reads to offer its restore.",
        "operationId": "get_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Read the sequence in Trash instead of a live one.",
            "in": "query",
            "name": "trashed",
            "required": false,
            "schema": {
              "default": false,
              "description": "Read the sequence in Trash instead of a live one.",
              "title": "Trashed",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found. The detail is \"Sequence is in Trash\" for one in Trash, which `trashed=true` reads, and \"Sequence not found\" otherwise. With `trashed=true`, \"Sequence not found in Trash\" for one that is not there."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a sequence with its graph",
        "tags": [
          "sequences"
        ]
      },
      "patch": {
        "description": "The autosave PATCH; carries expected_updated_at as the concurrency guard. Allowed while the sequence is running, because every field here is read fresh by the engine on the next tick. A sending_window is checked whatever the status and refused with a 422 naming the part at fault; an explicit null clears it.",
        "operationId": "update_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The sequence changed elsewhere. Reload before saving."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a sequence's settings",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/copy/": {
      "post": {
        "description": "Give this sequence's outbound agent the setup of another sequence's agent: its goal, call to action, language and translation choice, model, research switch, reply prompt and whether it drafts replies. This sequence's per-step prompts stay as they are, because they belong to its own steps. Takes the id of the sequence to copy from and returns this sequence's agent. The copy is written as a new version of the agent, so it can be undone from the agent's version history.",
        "operationId": "copy_outbound_agent_setup",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceAgentCopySchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceAgentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Asked with an API key."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Copy another sequence's agent setup",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/examples/": {
      "get": {
        "description": "Read saved samples or reviewed messages for this sequence's agent.\n\nOne preview writes a contact's whole sequence and saves each step's draft\nunder that step's ``slot_key``, so the steps of a previewed contact have\nsamples here: every one the agent found words for.",
        "operationId": "list_sequence_agent_examples",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "view",
            "required": false,
            "schema": {
              "default": "samples",
              "enum": [
                "samples",
                "reviewed"
              ],
              "title": "View",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "record_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Record Id"
            }
          },
          {
            "in": "query",
            "name": "slot_key",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Slot Key"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForId",
              "default": "id",
              "enum": [
                "id"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SequenceAgentExampleReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List saved samples or reviewed messages for a sequence's agent",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/preview/stream/": {
      "post": {
        "description": "Have the sequence's agent write one contact's whole sequence as a preview, in one call the way the real first send writes it (each later step reads the drafts before it), researching the contact on the web the way the real first message would, and stream its work as Server-Sent Events. The `result` frame carries the step asked for; each of the contact's other agent-written steps on their path that comes back with words is saved as a sample of its own step, read through the sequence's agent examples. A step that only runs on a branch this contact does not take, or a contact already sent a message, gets the asked step alone. Nobody receives the preview and it costs no credits; it counts against the workspace's daily preview allowance once for each step it writes, where a preview that researches counts for more than one that does not. The agent researches only when its research switch is on, the contact has never been researched and the workspace has credits; otherwise it writes from the contact's row and what earlier research found. The same preview asked for again the same day is shown again at no further cost, unless `fresh` asks for another, which writes the whole sequence again from its first step.\n\nThe first frame is `turn`, carrying the `preview_id` a Stop is sent to; then a `step` frame for each thing the agent did (searching, reading pages, writing, checking), each with its measured duration; then one `result` frame with the asked step's message, the agent's confidence, its reason for that rating and what the checks found.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `not_found` when the sequence, the step or the contact is gone, `limit` when today's preview allowance is spent, `stopped` when the caller stopped it, `ai_unavailable` when the agent's model cannot be asked right now (nothing about the workspace; a retry does not help until it is back), and no reason for anything else.\n\nClosing the connection does not stop the preview; the Stop route does.",
        "operationId": "stream_outbound_agent_preview",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceAgentPreviewRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceAgentPreviewReadSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of Server-Sent Events; the final `result` frame's `data` is the asked step's preview message."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview one contact's agent-written message, streaming the research",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/preview/{preview_id}/stop/": {
      "post": {
        "description": "Ask the preview streaming under `preview_id` (its first frame) to stop. Cooperative: the preview checks before each model call and while the model writes, and ends there, its stream closing on an `error` frame with reason `stopped`. A preview that has already finished is unaffected.",
        "operationId": "stop_outbound_agent_preview",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "preview_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Preview Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceAgentPreviewStopResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stop a preview that is being written",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/source-columns/": {
      "get": {
        "description": "The research and AI columns of the sequence's audience table, whose answers reach the agent as angles the team prepared for each contact: a Use AI column, a built-in research agent, or a field promoted out of one. Every one is used unless its id is in the agent's `write_from_excluded_column_ids`; the list includes those, so one taken out can be put back by changing that list on the agent. In table order; empty with no audience.",
        "operationId": "list_write_from_columns",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SequenceWriteFromColumnReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the audience columns the agent writes from",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/training-contacts/": {
      "get": {
        "description": "The sequence's audience in the order the AI writing tab lists it, as the picker shows it: each contact's row id and name. Reads only; no Preview is started.",
        "operationId": "list_sequence_training_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SequenceTrainingAudienceContactSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, audience contact, or Preview not found"
          },
          "409": {
            "description": "Sequence, agent, or Preview revision changed"
          },
          "422": {
            "description": "Invalid selection, verdict, or Preview action"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List contacts available for the Preview",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/training-contacts/bulk/": {
      "post": {
        "description": "Makes the threads already written as free previews for up to ten contacts those contacts' threads on the sequence's AI writing tab, word for word: nothing is written again, nothing is charged and no preview allowance is spent, so each contact's thread there shows the emails the previews showed and Looks good can be given on them. A step with no current preview shows as not written. The contacts join the sequence's open Preview; one already in it with the same words keeps its verdict. This never writes: the start route is what writes a thread. The answer names any kept thread written before the plain-words check that uses banned jargon or copies the business context, so it can be written again.",
        "operationId": "add_previews_to_sequence_training",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceTrainingAdoptSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceTrainingPreviewsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, audience contact, or Preview not found"
          },
          "409": {
            "description": "Sequence, agent, or Preview revision changed"
          },
          "422": {
            "description": "Invalid selection, verdict, or Preview action"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Keep threads already written on the AI writing tab",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/training-contacts/next/": {
      "get": {
        "description": "The next contact in the audience's order, after `after`, that nobody has given Looks good, or skipped, in the open run, whose thread holds no words a person pinned (their edit, or a message approved on Tasks), whose thread was not marked Looks good before, and whom the sequence can reach; from the top again when the end is reached. One email marked Looks good on its own from the Builder leaves the contact's other emails to be read. Null when there is nobody left, with `in_tasks` counting the contacts passed over because their email waits for approval in Tasks. Writes nothing.",
        "operationId": "next_sequence_training_contact",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "After"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceTrainingNextSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, audience contact, or Preview not found"
          },
          "409": {
            "description": "Sequence, agent, or Preview revision changed"
          },
          "422": {
            "description": "Invalid selection, verdict, or Preview action"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Name the contact to read after this one",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/training-sessions/": {
      "get": {
        "description": "The sequence's Previews, latest first, each beside whether it was written against the sequence's steps, audience and columns as they are now. The first is the one the AI writing tab works on; the list is empty when the sequence has never had a Preview.",
        "operationId": "list_sequence_training_sessions",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SequenceTrainingWithMatchReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, audience contact, or Preview not found"
          },
          "409": {
            "description": "Sequence, agent, or Preview revision changed"
          },
          "422": {
            "description": "Invalid selection, verdict, or Preview action"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the sequence's Previews",
        "tags": [
          "sequences"
        ]
      },
      "post": {
        "description": "Writes every message of the sequence for each contact, free, as the AI writing tab shows them. The contacts join the sequence's open Preview, so the ones already written stay and can be read again without writing; a contact already in it is written again, and its Looks good no longer pins its old words. A Preview holds ten contacts: past that, the oldest nobody rated makes room.",
        "operationId": "start_sequence_training",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceTrainingStartSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceTrainingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, audience contact, or Preview not found"
          },
          "409": {
            "description": "Sequence, agent, or Preview revision changed"
          },
          "422": {
            "description": "Invalid selection, verdict, or Preview action"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Write complete sequences for up to ten contacts",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/training-sessions/{session_id}/complete/": {
      "post": {
        "operationId": "close_sequence_training",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "session_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Session Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceTrainingActionSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceTrainingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, audience contact, or Preview not found"
          },
          "409": {
            "description": "Sequence, agent, or Preview revision changed"
          },
          "422": {
            "description": "Invalid selection, verdict, or Preview action"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Close the Preview and keep its reviews",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/": {
      "patch": {
        "description": "Looks good (`good`) or Skip (`skipped`) on a contact's whole thread. Looks good makes the thread what sends, until the agent's writing or the contact's row changes, and teaches nothing itself. Needs work is a thumbs down on the contact instead (`POST /agent-learnings/thumbs-downs/`, kind `writing_preview`): it asks what's wrong, saves a learning and writes the thread again. `bad` here is refused with a 422. Looks good saves the changes a Needs work left proposed on the contact; with `rev`, only as the page showed it, and a feedback session that moved on since is refused with a 409.",
        "operationId": "review_sequence_training_contact",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "session_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Session Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceTrainingReviewSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceTrainingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, audience contact, or Preview not found"
          },
          "409": {
            "description": "Sequence, agent, or Preview revision changed"
          },
          "422": {
            "description": "Invalid selection, verdict, or Preview action"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Review a contact's whole thread in the Preview",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/agent/training-sessions/{session_id}/retry/": {
      "post": {
        "operationId": "retry_sequence_training",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "session_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Session Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would happen, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would happen, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceTrainingActionSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceTrainingReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, audience contact, or Preview not found"
          },
          "409": {
            "description": "Sequence, agent, or Preview revision changed"
          },
          "422": {
            "description": "Invalid selection, verdict, or Preview action"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Write the Preview's failed messages again",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/audience/": {
      "patch": {
        "description": "Allowed while the sequence is running, unlike setting the audience: a remap within the same table orphans no enrolment, whereas rebinding does.",
        "operationId": "patch_column_mapping",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ColumnMappingUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The audience is not configured yet."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Remap the audience columns without rebinding the table",
        "tags": [
          "sequences"
        ]
      },
      "put": {
        "description": "A draft adds no column to the table: the sequence-status column arrives at launch, so a table picked and then abandoned is left as it was. A sequence that has launched before gets its column on the new table straight away.\n\nBinding a draft ENROLS from the audience before returning, so the Contacts tab is populated the moment the choice is made rather than at the next sweep. A draft's enrolments sit ACTIVE and unsent: the send tick only ever claims rows belonging to a RUNNING sequence. A sequence that has launched answers as soon as the change is saved, and its contacts follow in the background within seconds: those the new audience leaves out stop, and new matches join.\n\nA table that lists companies, not people, is refused with that sentence (GET /sequences/audience-refusals/ names such tables).",
        "operationId": "put_audience",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudiencePutSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The sequence changed elsewhere. Reload before saving."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "423": {
            "description": "The sequence is running. Pause it to rebind the audience."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Set the audience: table, view, column mapping",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/audience/impact/": {
      "get": {
        "description": "Reads the table or saved view the sequence would draw from, the way enrolment would after the change, and says for each choice (keep existing journeys, or start them fresh) how many contacts are added, removed and not changed. On the same table, keeping journeys applies the new filter: contacts it no longer selects stop. Writes nothing.",
        "operationId": "preview_audience_replacement",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "view_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "View Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudienceReplacementPreviewReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview a replacement audience before choosing how existing journeys continue",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/audience/preview/": {
      "get": {
        "description": "The reassurance banner: \"4,120 rows, 3,890 will be enrolled\", and why not.",
        "operationId": "preview_audience",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudiencePreviewReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The audience is not configured yet."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview what the audience resolves to",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/audit-logs/": {
      "get": {
        "description": "Who created, edited, launched, paused and resumed this sequence, newest first. A pause carries its reason, so an automatic stop (no sender could send, the balance ran out, too many bounced) explains itself.\n\nKept indefinitely, and deliberately not tied to the sequence by a foreign key, so the record of a deletion outlives what it describes.\n\nA roster change the AI Assistant made through a granted workspace action lands as `assistant_applied`, naming the proposal it came from, so the change and the card that asked for it read together.",
        "operationId": "list_sequence_audit_logs",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SequenceAuditLogReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sequence not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a sequence's activity",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/browser-runs/{run_id}/replay/": {
      "get": {
        "description": "Whether the recording of a Browser use run's cloud browser can be watched, and its pages in order, each played by its own playlist (`.../replay/pages/{page_id}/download/`). `ready` lists the pages; `expired` means the browser ran and its recording is no longer kept; `none` means the browser never opened. The recording is found from the run itself; no page addresses are given. A signed-in person only, and a read: watching a recording of a run that kept hidden values is recorded by `.../replay/open/`, which the player calls before it plays.",
        "operationId": "get_browser_run_replay",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserReplayReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "The recording could not be read just now. Try again in a minute."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "A Browser use run's recording",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/browser-runs/{run_id}/replay/open/": {
      "post": {
        "description": "Records that the recording of a Browser use run's cloud browser was watched, and answers it as `.../replay/` does. A recording shows what the run typed, a hidden value (a password it made up) among them, so opening one of a run that kept hidden values is recorded on the sequence's activity as a reveal of them, naming the run and which values, never the values. Nothing is recorded for a run that kept none, or whose recording can no longer be watched. Call this before playing; `.../replay/` alone only reads. A signed-in person only.",
        "operationId": "open_browser_run_replay",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserReplayReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "The recording could not be read just now. Try again in a minute."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Open a Browser use run's recording",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/browser-runs/{run_id}/replay/pages/{page_id}/download/": {
      "get": {
        "description": "The HLS playlist (`application/vnd.apple.mpegurl`) that plays one page of the run's recording, as `.../replay/` listed it. Its segment links are signed by the recording's host and last a short while, so a player reads the playlist again rather than keeping it. A signed-in person only, as the recording's list is.",
        "operationId": "download_browser_run_replay_page",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "page_id",
            "required": true,
            "schema": {
              "maxLength": 200,
              "title": "Page Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/vnd.apple.mpegurl": {}
            },
            "description": "The playlist."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "The recording could not be read just now. Try again in a minute."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "One page of a Browser use run's recording, as a playlist",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/browser-runs/{run_id}/reveal/": {
      "post": {
        "description": "The values a run kept hidden (a password it made up for the contact, an output the step marks hidden), which no other read returns. Each reveal is recorded on the sequence's activity, naming the run and which values were shown, never the values. Empty when the run kept none, and then nothing is recorded. A signed-in person only: no API key reads a secret.",
        "operationId": "reveal_browser_run_outputs",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserRevealedOutputsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Show the values a Browser use run kept out of sight",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/browser-trials/{trial_id}/replay/": {
      "get": {
        "description": "Whether the recording of a trial's cloud browser can be watched, and its pages, as a run's recording reads (`/sequences/{sequence_id}/browser-runs/{run_id}/replay/`). A signed-in person only, and a read: `.../replay/open/` records the watch.",
        "operationId": "get_browser_trial_replay",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "trial_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Trial Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserReplayReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "The recording could not be read just now. Try again in a minute."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "A Browser use trial's recording",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/browser-trials/{trial_id}/replay/open/": {
      "post": {
        "description": "Records that a trial's recording was watched, and answers it as `.../replay/` does. Opening one of a trial that kept hidden values is recorded on the sequence's activity as a reveal of them, as a run's is. A signed-in person only.",
        "operationId": "open_browser_trial_replay",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "trial_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Trial Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserReplayReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "The recording could not be read just now. Try again in a minute."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Open a Browser use trial's recording",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/browser-trials/{trial_id}/replay/pages/{page_id}/download/": {
      "get": {
        "description": "The HLS playlist that plays one page of a trial's recording, as `.../replay/` listed it; a run's page download's rules. A signed-in person only.",
        "operationId": "download_browser_trial_replay_page",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "trial_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Trial Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "page_id",
            "required": true,
            "schema": {
              "maxLength": 200,
              "title": "Page Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/vnd.apple.mpegurl": {}
            },
            "description": "The playlist."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "The recording could not be read just now. Try again in a minute."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "One page of a Browser use trial's recording, as a playlist",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/browser-trials/{trial_id}/reveal/": {
      "post": {
        "description": "The values a trial kept hidden, which no other read returns, as a run's reveal shows them. Each reveal is recorded on the sequence's activity, marked as a trial's, never with the values. A signed-in person only.",
        "operationId": "reveal_browser_trial_outputs",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "trial_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Trial Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserRevealedOutputsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Show the values a Browser use trial kept out of sight",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/budget/": {
      "get": {
        "operationId": "get_sequence_budget",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceBudgetReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read sequence spending and reservations",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/capacity/": {
      "get": {
        "description": "Today's daily capacity summed across every connected mailbox on the sequence's senders, the same calculation behind the workspace capacity tile and the launch pre-flight. `sends_email` says whether any of it applies: a LinkedIn-only sequence sends no email.",
        "operationId": "get_sequence_capacity",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceCapacityReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the combined send capacity of the sequence's assigned senders",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/changes/apply/": {
      "post": {
        "description": "Applies the change set a review read, all of it or none of it. With `dry_run` it runs the whole apply, refusals included, answers the sequence as it would stand afterwards and keeps nothing: nothing is saved, no workflow starts and no screen is told.",
        "operationId": "apply_sequence_changes",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Report what the sequence would be, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what the sequence would be, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceChangesSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, sender, audience, or writing setup not found."
          },
          "409": {
            "description": "Configuration changed or review is stale."
          },
          "422": {
            "description": "Proposed configuration is invalid."
          },
          "423": {
            "description": "This action requires pausing the sequence."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Apply the reviewed changes atomically",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/changes/preview/": {
      "post": {
        "operationId": "preview_sequence_changes",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceChangesSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceChangesPreviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "Sequence, sender, audience, or writing setup not found."
          },
          "409": {
            "description": "Configuration changed or review is stale."
          },
          "422": {
            "description": "Proposed configuration is invalid."
          },
          "423": {
            "description": "This action requires pausing the sequence."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Review proposed live changes",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/check/": {
      "get": {
        "description": "Every launch-blocking problem, addressed to the tab that fixes it. `ok` is true when no finding blocks the launch; findings that do not block are listed too.",
        "operationId": "get_preflight",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceCheckReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Check a sequence before it launches",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/": {
      "delete": {
        "description": "Removes the contacts named in `ids` (at most 100), or with `all=true` every contact the given filters match, less any `excluded_ids`. A request that names nobody is refused. The set is resolved on the server, never from a client-side id list, so the action covers every match across pages. Each removal keeps the durable single-remove semantics. `count` is how many contacts this call stopped: one already stopped keeps the stop it had and is not counted.",
        "operationId": "bulk_remove_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Only contacts in these statuses (everything but, with exclude).",
            "in": "query",
            "name": "statuses",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/EnrolmentStatus"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts in these statuses (everything but, with exclude).",
              "title": "Statuses"
            }
          },
          {
            "description": "Only contacts stopped for these reasons (everything but, with exclude).",
            "in": "query",
            "name": "stop_reasons",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/StopReason"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts stopped for these reasons (everything but, with exclude).",
              "title": "Stop Reasons"
            }
          },
          {
            "description": "Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.",
            "in": "query",
            "name": "exclude",
            "required": false,
            "schema": {
              "default": false,
              "description": "Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.",
              "title": "Exclude",
              "type": "boolean"
            }
          },
          {
            "description": "Matches the contact's address, company, name or company name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Matches the contact's address, company, name or company name.",
              "title": "Search"
            }
          },
          {
            "description": "Only contacts added on or after this instant.",
            "in": "query",
            "name": "created_from",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts added on or after this instant.",
              "title": "Created From"
            }
          },
          {
            "description": "Only contacts added on or before this instant.",
            "in": "query",
            "name": "created_to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts added on or before this instant.",
              "title": "Created To"
            }
          },
          {
            "description": "Only contacts whose latest settled Browser use run took one of these outcomes, by key (outcome_1 to outcome_8, or needs_human), as each row's browser_outcome says. Never flipped by exclude.",
            "in": "query",
            "name": "outcomes",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/SequenceEdgeBranch"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts whose latest settled Browser use run took one of these outcomes, by key (outcome_1 to outcome_8, or needs_human), as each row's browser_outcome says. Never flipped by exclude.",
              "title": "Outcomes"
            }
          },
          {
            "description": "The contacts to remove, by enrolment id.",
            "in": "query",
            "name": "ids",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The contacts to remove, by enrolment id.",
              "title": "Ids"
            }
          },
          {
            "description": "Remove every contact the filters match, or every contact.",
            "in": "query",
            "name": "all",
            "required": false,
            "schema": {
              "default": false,
              "description": "Remove every contact the filters match, or every contact.",
              "title": "All",
              "type": "boolean"
            }
          },
          {
            "description": "The Audience tab's tab the grid was showing. A removal of everything matching reaches only the contacts under it.",
            "in": "query",
            "name": "group",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ContactGroup"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The Audience tab's tab the grid was showing. A removal of everything matching reaches only the contacts under it.",
              "title": "Group"
            }
          },
          {
            "description": "With the filters or all, contacts to leave out: the rows unticked.",
            "in": "query",
            "name": "excluded_ids",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "With the filters or all, contacts to leave out: the rows unticked.",
              "title": "Excluded Ids"
            }
          },
          {
            "description": "The order the grid was listing in. Under a 'group', the removal judges the same contacts the tab's list judged in that order.",
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ContactOrderBy",
              "default": "created_at",
              "description": "The order the grid was listing in. Under a 'group', the removal judges the same contacts the tab's list judged in that order."
            }
          },
          {
            "description": "The direction of order_by.",
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "description": "The direction of order_by.",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "With the filters or all, remove only the FIRST n of the matches, newest added first (under a group, in the order above), instead of every match.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maximum": 100000,
                  "minimum": 1,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "With the filters or all, remove only the FIRST n of the matches, newest added first (under a group, in the order above), instead of every match.",
              "title": "Limit"
            }
          },
          {
            "description": "Answer how many contacts would be removed, exactly as the real call does.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer how many contacts would be removed, exactly as the real call does.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The request names nobody, or names contacts and filters both."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Remove many contacts from the sequence",
        "tags": [
          "sequences"
        ]
      },
      "get": {
        "description": "Newest-first unless ordered; each row names why it is where it is. 'group' lists one tab of the Audience tab (In progress, Needs approval, Paused, Done, Blocked, Removed), which get_audience_eligibility counts over the whole roster and count_sequence_contacts_per_group under the same filters. With no filter every contact is listed, the Removed tab's included (removed by hand, or their row deleted from the table or out of the view); the All tab sends group__not=removed to list the contacts still in the audience. Order by 'status' to read them the way the Status column does, first in line on top (a LinkedIn step a browser is running now, then everyone with a next move by when it happens, then Needs approval, then everyone done), or by 'due_at' or 'created_at'. Status, stop reason, search and the added-date range all filter server-side. `GET /sequences/{sequence_id}/contacts/length/` counts what the filters match.",
        "operationId": "list_sequence_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "created_from",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts added on or after this instant.",
              "title": "Created From"
            },
            "description": "Only contacts added on or after this instant."
          },
          {
            "in": "query",
            "name": "created_to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts added on or before this instant.",
              "title": "Created To"
            },
            "description": "Only contacts added on or before this instant."
          },
          {
            "in": "query",
            "name": "exclude",
            "required": false,
            "schema": {
              "default": false,
              "description": "Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.",
              "title": "Exclude",
              "type": "boolean"
            },
            "description": "Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle."
          },
          {
            "in": "query",
            "name": "group",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ContactGroup"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the contacts under this tab of the Audience tab, as get_audience_eligibility's 'groups' counts them, or the length route's under the same filters."
            },
            "description": "Only the contacts under this tab of the Audience tab, as get_audience_eligibility's 'groups' counts them, or the length route's under the same filters."
          },
          {
            "in": "query",
            "name": "group__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "const": "removed",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave out the contacts under these tabs of the Audience tab. Only 'removed' (removed by hand, or their row deleted from the table or out of the view) is taken: the All tab sends it, as it lists the contacts still in the audience. A 'group' named here lists nobody.",
              "title": "Group  Not"
            },
            "description": "Leave out the contacts under these tabs of the Audience tab. Only 'removed' (removed by hand, or their row deleted from the table or out of the view) is taken: the All tab sends it, as it lists the contacts still in the audience. A 'group' named here lists nobody."
          },
          {
            "in": "query",
            "name": "outcomes",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/SequenceEdgeBranch"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts whose latest settled Browser use run took one of these outcomes, by key (outcome_1 to outcome_8, or needs_human), as each row's browser_outcome says. Never flipped by exclude.",
              "title": "Outcomes"
            },
            "description": "Only contacts whose latest settled Browser use run took one of these outcomes, by key (outcome_1 to outcome_8, or needs_human), as each row's browser_outcome says. Never flipped by exclude."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Matches the contact's address, company, name or company name.",
              "title": "Search"
            },
            "description": "Matches the contact's address, company, name or company name."
          },
          {
            "in": "query",
            "name": "skip_browser_steps",
            "required": false,
            "schema": {
              "default": false,
              "description": "Leave out the contacts standing on a Browser use step. Their date is a backstop for the run, never a send, so the Overview's Next send reads the soonest due contact with this on.",
              "title": "Skip Browser Steps",
              "type": "boolean"
            },
            "description": "Leave out the contacts standing on a Browser use step. Their date is a backstop for the run, never a send, so the Overview's Next send reads the soonest due contact with this on."
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/EnrolmentStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts in this status."
            },
            "description": "Only contacts in this status."
          },
          {
            "in": "query",
            "name": "statuses",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/EnrolmentStatus"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts in these statuses (everything but, with exclude).",
              "title": "Statuses"
            },
            "description": "Only contacts in these statuses (everything but, with exclude)."
          },
          {
            "in": "query",
            "name": "stop_reasons",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/StopReason"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts stopped for these reasons (everything but, with exclude).",
              "title": "Stop Reasons"
            },
            "description": "Only contacts stopped for these reasons (everything but, with exclude)."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAtDueAtStatus",
              "default": "created_at",
              "enum": [
                "created_at",
                "due_at",
                "status"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_EnrolmentReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a sequence's contacts",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/breakdown/": {
      "get": {
        "description": "How many contacts were added, are in progress and have finished, with every reason a contact was not sent to.",
        "operationId": "get_contacts_breakdown",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactsBreakdownReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Contacts breakdown",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/bulk/pause/": {
      "post": {
        "description": "Holds each in-flight contact exactly where it stands. Takes the Audience tab's selection: listed `ids`, or `all=true` for every contact the given filters match, less any `excluded_ids`. Each contact is judged on its own and one the action cannot apply to is skipped rather than failing the batch, because a selection is rarely uniform: `updated` reports how many actually took it.",
        "operationId": "bulk_pause_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactSelectionSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceContactBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Pause many contacts",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/bulk/resume/": {
      "post": {
        "description": "Picks contacts back up where they stood, finishing any wait they were in and never restarting at step 1: wakes a paused contact, and undoes a reply stop, a cooldown stop or a mailbox_removed stop (that one only once its mailbox is back on the sequence, and not for a contact who has replied or bounced since). With `out_of_office=true`, reaches only the contacts whose thread reads out of office: one snoozed to a stated return date is due now, and one a misclassified auto-responder stopped as a reply picks up where they stopped. Takes the Audience tab's selection: listed `ids`, or `all=true` for every contact the given filters match, less any `excluded_ids`. Each contact is judged on its own and one the action cannot apply to is skipped rather than failing the batch, because a selection is rarely uniform: `updated` reports how many actually took it.",
        "operationId": "bulk_resume_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResumeContactsSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceContactBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Resume many contacts",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/bulk/retry/": {
      "post": {
        "description": "Re-queues each FAILED contact at the exact step that broke. A failure preserves its step pointer, so a retry is a re-attempt, never a restart. A failed contact another live sequence has taken since stays failed here and is counted in `in_other_sequence`. One a Browser use step failed for an empty value stays failed while the value is still empty, counted in `still_missing` with the values named in `missing_values`. Idempotent: a second call retries nothing. To retry every failed contact, send `all=true` with `statuses` of `failed`. Takes the Audience tab's selection: listed `ids`, or `all=true` for every contact the given filters match, less any `excluded_ids`. Each contact is judged on its own and one the action cannot apply to is skipped rather than failing the batch, because a selection is rarely uniform: `updated` reports how many actually took it.",
        "operationId": "bulk_retry_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactSelectionSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceContactBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Retry many failed contacts",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/bulk/send-now/": {
      "post": {
        "description": "Makes each waiting contact's next step due now instead of when its wait ends; pacing, the daily cap and approvals still apply. Takes the Audience tab's selection: listed `ids`, or `all=true` for every contact the given filters match, less any `excluded_ids`. Each contact is judged on its own and one the action cannot apply to is skipped rather than failing the batch, because a selection is rarely uniform: `updated` reports how many actually took it.",
        "operationId": "bulk_send_now_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactSelectionSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceContactBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Send the next step now to many contacts",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/bulk/stop/": {
      "post": {
        "description": "Halts each contact's journey for good: they receive no further step, and nothing restarts them except a person's resume of a stop a reply, the recontact rule or a removed mailbox caused. Takes the Audience tab's selection: listed `ids`, or `all=true` for every contact the given filters match, less any `excluded_ids`. Each contact is judged on its own and one the action cannot apply to is skipped rather than failing the batch, because a selection is rarely uniform: `updated` reports how many actually took it.",
        "operationId": "bulk_stop_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactSelectionSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceContactBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stop many contacts",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/eligibility/": {
      "get": {
        "description": "Judges the sequence's contacts as the Audience tab counts them: how many were added and checked, how many a step can reach, how many are blocked and why, a sample of contacts per reason, and how many sit under each tab of the roster (In progress, Needs approval, Paused, Done, Blocked, Removed). 'added' counts every contact, the Removed tab's included (removed by hand, or their row deleted from the table or out of the view), where the Sequences list's contacts_added leaves them out. The All tab counts added less groups.removed. 'capped' says the roster is longer than one read checks. list_sequence_contacts' 'group' lists the contacts under one tab.",
        "operationId": "get_audience_eligibility",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudienceEligibilityReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Audience eligibility and actionable reasons",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/length/": {
      "get": {
        "description": "How the contacts matching a search or filter split across the Audience tab's tabs (In progress, Needs approval, Paused, Done, Blocked, Removed), judged as list_sequence_contacts' 'group' lists them under the same filters, so each count is the length of that tab's filtered list. 'count' is every match, the Removed tab's included: the All tab counts this less groups.removed, or send group__not=removed for the All tab's count as 'count' (groups.removed then reads 0). 'capped' says more contacts match than one read judges. The page's tabs read it while its search box or a filter is on; get_audience_eligibility counts the whole roster. include_tabs=false answers 'count' alone, much faster.",
        "operationId": "count_sequence_contacts_per_group",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Only contacts in these statuses (everything but, with exclude).",
            "in": "query",
            "name": "statuses",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/EnrolmentStatus"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts in these statuses (everything but, with exclude).",
              "title": "Statuses"
            }
          },
          {
            "description": "Only contacts stopped for these reasons (everything but, with exclude).",
            "in": "query",
            "name": "stop_reasons",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/StopReason"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts stopped for these reasons (everything but, with exclude).",
              "title": "Stop Reasons"
            }
          },
          {
            "description": "Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.",
            "in": "query",
            "name": "exclude",
            "required": false,
            "schema": {
              "default": false,
              "description": "Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.",
              "title": "Exclude",
              "type": "boolean"
            }
          },
          {
            "description": "Matches the contact's address, company, name or company name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Matches the contact's address, company, name or company name.",
              "title": "Search"
            }
          },
          {
            "description": "Only contacts added on or after this instant.",
            "in": "query",
            "name": "created_from",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts added on or after this instant.",
              "title": "Created From"
            }
          },
          {
            "description": "Only contacts added on or before this instant.",
            "in": "query",
            "name": "created_to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts added on or before this instant.",
              "title": "Created To"
            }
          },
          {
            "description": "Only contacts whose latest settled Browser use run took one of these outcomes, by key (outcome_1 to outcome_8, or needs_human), as each row's browser_outcome says. Never flipped by exclude.",
            "in": "query",
            "name": "outcomes",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/SequenceEdgeBranch"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only contacts whose latest settled Browser use run took one of these outcomes, by key (outcome_1 to outcome_8, or needs_human), as each row's browser_outcome says. Never flipped by exclude.",
              "title": "Outcomes"
            }
          },
          {
            "description": "Leave out the contacts under these tabs, as list_sequence_contacts does. Only 'removed' is taken: with it, 'count' is the All tab's count of the matches and groups.removed reads 0.",
            "in": "query",
            "name": "group__not",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "const": "removed",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Leave out the contacts under these tabs, as list_sequence_contacts does. Only 'removed' is taken: with it, 'count' is the All tab's count of the matches and groups.removed reads 0.",
              "title": "Group  Not"
            }
          },
          {
            "description": "Judge which tab each matching contact sits under. False counts the matches alone, with one count and nobody judged: 'count' is every match, every tab reads 0 and 'capped' is false. For a caller that needs only how many match, such as a confirmation.",
            "in": "query",
            "name": "include_tabs",
            "required": false,
            "schema": {
              "default": true,
              "description": "Judge which tab each matching contact sits under. False counts the matches alone, with one count and nobody judged: 'count' is every match, every tab reads 0 and 'capped' is false. For a caller that needs only how many match, such as a confirmation.",
              "title": "Include Tabs",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactsPerGroupReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count the contacts a filter matches under each tab",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/{enrolment_id}/": {
      "delete": {
        "description": "Stops the contact and keeps them out: enrolment sync skips a row that already has an enrolment, so this survives continuous enrolment instead of being undone at the next pass. A contact already stopped keeps the stop it had and answers `count` 0, \"Contact was already stopped\": nothing changed.",
        "operationId": "remove_enrolment",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "enrolment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Enrolment Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Remove one contact from the sequence",
        "tags": [
          "sequences"
        ]
      },
      "get": {
        "description": "One contact as the Audience tab's row shows them: their status, the step they stand on and when it runs, what holds them, and who they are. Beside it, every filled column of their audience row, in the table's order, and upcoming_skip: whether the step they wait on will be skipped once they reach it, read from their row as it is today. What the sequence did to them is get_contact_history.",
        "operationId": "get_sequence_contact",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "enrolment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Enrolment Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrolmentDetailReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "One contact in this sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/{enrolment_id}/history/": {
      "get": {
        "description": "Everything the sequence did to one contact, oldest first: the emails it sent with their subject and body, the LinkedIn actions it ran with their message, the branch each condition took, and each step it moved them past without doing it, with why (no email address, an email verdict the sequence does not send to, no LinkedIn URL).\n\nAssembled from stores that each remember a different part. The send fence knows an email was accepted and when; the send log knows what it said; the action queue is both at once for LinkedIn; the condition ledger knows which way a branch went, and the skip ledger which steps were passed, because the engine moves the pointer and forgets.\n\nWhere a step went through the approval queue, the entry also says what was decided, when, and by whom, as a name. A rejected email appears only this way: it never reached the send fence.\n\nThe contact's own part is there too: their reply, with what they wrote and the inbox conversation it opens, and the email a bounce came back for. Every filled column of their audience row, and whether the step they wait on will be skipped, are get_sequence_contact's.",
        "operationId": "get_contact_history",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "enrolment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Enrolment Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForAt",
              "default": "at",
              "enum": [
                "at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ContactHistoryEntryReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "One contact's history in this sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/{enrolment_id}/move/": {
      "post": {
        "description": "Move to another sequence, all or nothing: the contact leaves this sequence only when the target takes them. When the target cannot (no address it can use, the do-not-contact list, the recontact rule, already in it, a different audience table) the answer is a 422 whose message says why, and the contact stays here untouched. Returns the contact's place in THIS sequence, now stopped.",
        "operationId": "move_enrolment",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "enrolment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Enrolment Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MoveContactRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrolmentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The target sequence would not take the contact; they stay here."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Move one contact to another sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/{enrolment_id}/pause/": {
      "post": {
        "description": "Holds an in-flight contact exactly where it stands. Paused contacts are never claimed by the engine, keep their step and their one-live-sequence slot, and a reply or unsubscribe still stops them. Valid only for a contact currently active or claimed.",
        "operationId": "pause_enrolment",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "enrolment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Enrolment Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrolmentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The enrolment is not in a pausable state."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Pause one contact",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/contacts/{enrolment_id}/resume/": {
      "post": {
        "description": "Picks a contact back up where they stood, never at step 1. A paused contact wakes at the step it stood on: due when the wait it was paused in ends, as that step's wait stands now, or immediately if it was not waiting. A reply stop (an auto-responder, or a bounce misclassified as a reply), a declined stop (a no the AI misread) and a mailbox_removed stop pick up exactly where they stopped; a cooldown stop starts at step 1. A mailbox_removed stop resumes only once the mailbox that emails the contact is back on the sequence. An unsubscribe or suppression stop is a compliance stop and is never resumable here.",
        "operationId": "resume_enrolment",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "enrolment_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Enrolment Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrolmentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The contact is neither paused nor stopped by something a person can undo."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Resume one paused or stopped contact",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/duplicate/": {
      "post": {
        "description": "Copies structure and settings, never the audience and never the stats. The copy is filed in the same folder.",
        "operationId": "duplicate_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Duplicate a sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/email-searches/": {
      "post": {
        "description": "Look up work emails for the contacts in a sequence's audience that have none, and send the sequence to the ones found. Spends credits: price it first with estimate_missing_emails, over exactly the same contacts. Adds a Work email column to the audience table when it has none, and runs it only on those contacts, never on a row that already has an address or was looked up before. When the sequence's email column is itself that column, found addresses land in it; when no email column is mapped, the Work email column becomes it; when the email column holds addresses of its own, a Default if empty column reads it first and the found email second, and the sequence reads that column once it has filled in. Answers with the run: emails fill in row by row over the next minutes, and contacts join a live sequence as theirs arrive.",
        "operationId": "find_missing_emails",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MissingEmailsFindReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sequence not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Find a sequence's missing work emails",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/email-searches/preview/": {
      "get": {
        "description": "How many contacts in a sequence's audience have no email yet, and what finding their work emails would cost, before anything runs. The contacts are the audience rows with no address in the email column that a Find work email lookup has not tried yet: the same count the launch check's `contacts_missing_email` finding carries. Free, and changes nothing. Quote `expected_credits`; `adds_column` says a Work email column would be added first. Refused with a sentence to relay when nobody is missing an email, when the table has no name and company columns to find one from, or when lookups are unavailable. find_missing_emails spends it.",
        "operationId": "estimate_missing_emails",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MissingEmailsEstimateReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sequence not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Price finding a sequence's missing work emails",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/email-verifications/": {
      "post": {
        "description": "Check whether the addresses in a sequence's audience are deliverable, and have the sequence email only the ones whose verdict it accepts (valid alone unless the Audience tab or set_sequence_audience chose more). Spends credits: price it first with estimate_email_verification, over exactly the same addresses. Adds a Verify email column over the sequence's email column when the table has none, points the sequence's email deliverability at it, and runs it only on addresses it has not checked. Answers with the run: verdicts fill in row by row over the next minutes, and a contact's email step waits for theirs.",
        "operationId": "verify_sequence_emails",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailVerificationRunReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sequence not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Verify a sequence's emails",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/email-verifications/preview/": {
      "get": {
        "description": "How many addresses in a sequence's audience have not been verified yet, and what verifying them would cost, before anything runs. The addresses are the audience rows with an email that the Verify email column has not checked: the same count the launch check's `emails_not_verified` finding carries. Free, and changes nothing. Quote `expected_credits`; `adds_column` says a Verify email column would be added over the sequence's email column first, and `maps_column` that the sequence would start reading its verdicts. Refused with a sentence to relay when every address is verified already, when no email column is mapped, or when verification is unavailable. verify_sequence_emails spends it.",
        "operationId": "estimate_email_verification",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailVerificationEstimateReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sequence not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Price verifying a sequence's emails",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/email-verifications/progress/": {
      "get": {
        "description": "How far the Verify email column the sequence reads has got over its audience's addresses: `total` addresses, `checked`, `pending` and `failed`, counted the way sending judges them, so `pending` is exactly who would wait as Verifying email. `verifying` is true while a run is still checking and some addresses wait. All zero when the sequence sends no email or reads no Verify email column over its email column. Cheap enough to poll every few seconds while the launch dialog is open.",
        "operationId": "get_email_verification_progress",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailVerificationProgressReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Sequence not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Follow a sequence's email verification",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/favorite/": {
      "delete": {
        "description": "Remove this sequence from the CALLING USER's Favorites. Per person: a teammate's star stays. Unstarring a sequence that is not starred changes nothing and counts none.",
        "operationId": "delete_sequence_favorite",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Unstar a sequence",
        "tags": [
          "sequences"
        ]
      },
      "put": {
        "description": "Star this sequence for the CALLING USER, which is what the Sequences list's Favorites holds. Per person: starring a sequence does not star it for a teammate. Starring a starred sequence changes nothing. Unstarring is the delete of the same address.",
        "operationId": "set_sequence_favorite",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceUserPrefsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Star a sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/funnel/": {
      "get": {
        "description": "Waiting, executed and failed counts per step, and the yes/no split per condition. Computed live rather than from the cached rollups, because being current is the point. `orphaned_executed` holds sends belonging to steps deleted from a running sequence, so the canvas totals still reconcile with the sequence's own sent count.",
        "operationId": "get_sequence_funnel",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceFunnelReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Live per-node counts for the builder",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/graph/": {
      "put": {
        "description": "Structural edits save immediately; the graph is validated before it lands. Allowed while the sequence is running: every contact follows the edited graph as a new contact would from where they stand. One who has done nothing on their step yet goes where the way they came in by now leads, so a step put in front of theirs reaches them first; a contact whose step is deleted goes on to the step that now follows it, or down the branch a deleted check kept; a step they already did is never sent again. A changed wait re-dates the contacts already waiting on it, from when their wait began. A contact who had finished at an end the edit connects to a step goes on to that step, its wait counted from when their last step finished, unless since then they replied, opted out, bounced, went on the do-not-contact list, answered or joined another sequence, were reached by one, left the audience, or lost their mailbox. A step whose words change is asked again with its new words wherever its old ones wait for approval, wait approved for the sending window or wait in a LinkedIn line no browser has started; a person's own edit of a contact's words is kept, and the agent writes its unsent, unedited messages for a step whose prompt changed again.",
        "operationId": "put_graph",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceGraphPutSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The sequence changed elsewhere. Reload before saving."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Replace the sequence graph",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/holds/": {
      "get": {
        "description": "Whether anybody on the sequence can move right now, and if not, why: every reason holding live contacts, worst first, with how many each holds and, for a LinkedIn reason, whose account it is. The Overview headline, the Audience banner, the header caption and each step card read this one answer.",
        "operationId": "get_sequence_holds",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceHoldsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Why nothing is moving",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/launch/": {
      "post": {
        "description": "Pre-flight must be clean. Launching creates the send-log table when the sequence has an email step, and runs the first enrolment sync inline, so contacts appear the moment the button is pressed. The contacts due now start straight away rather than on the engine's next minute: `starting_now` says how many, and `starts_at` says when the roster starts instead when the sending window is closed.",
        "operationId": "launch_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceLaunchReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Pre-flight issues block the launch."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Launch a sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/message-performance/": {
      "get": {
        "description": "One row per non-condition step, in graph order. Email rows count accepted sends and attribute replies/bounces to the contact's last accepted send (the send log's own amendment rule); LinkedIn rows count succeeded actions and carry nulls where per-step attribution would be a guess.",
        "operationId": "get_message_performance",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_StepPerformanceReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Per-step message performance",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/observed-costs/": {
      "get": {
        "description": "The samples a sequence's usual price per contact is read from: how many contacts its agent was charged to write to or previewed as a send writes them, how many of those read the web and their LinkedIn profile, and each Browser use step's runs that opened a browser with what they charged. The header's \"About N credits per contact\" reads this one answer.",
        "operationId": "get_sequence_observed_costs",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceObservedCostsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "What a sequence's contacts have cost so far",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/open/": {
      "post": {
        "description": "Note that the CALLING USER just opened this sequence, which is what feeds their Recent on the Sequences list. Best-effort: clients fire it on open and ignore the result. Never touches the star: opening a sequence says nothing about whether the person wants it starred.",
        "operationId": "record_sequence_view",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceUserPrefsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Record that the caller opened this sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/pause/": {
      "post": {
        "description": "Scheduling stops immediately; every enrolment stays exactly where it is. Nothing is sent while it is paused: its queued LinkedIn steps leave every browser's line, approved or not, and only a step a browser was already handed may finish. A Browser use run whose cloud browser is open stops within seconds, and the minutes it ran are charged; `browsers_stopping` counts them.",
        "operationId": "pause_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequencePauseReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Pause a sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/reply-stats/": {
      "get": {
        "description": "What the sequence's replies came to, over all time: each label's replies and who gave the label, the agent or a person; the not-now replies; the drafts the agent wrote and how each went out; the questions it asked and how many were answered; how many replies wait on a person now and since when; the median time from a contact's first reply to your first answer; and what writing the replies cost, in tenths of a credit. Each reply counts in the sequence it came in on. Computed live.",
        "operationId": "get_sequence_reply_stats",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReplyStatsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Reply numbers",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/restore/": {
      "post": {
        "description": "Take a sequence out of Trash. A launched one comes back paused, and only Resume starts it again; a draft comes back a draft. Its contacts are taken back where they stood, in the background, unless another sequence took them meanwhile (contacts_held_elsewhere counts them: they stay stopped), they replied, or their row left the audience.\n\nFails while a live sequence has its name: rename one of the two first. Fails for a sequence that went to Trash with a folder (`trashed_with_folder_id`), which comes back with it: POST /sequences/folders/{id}/restore/.",
        "operationId": "restore_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Report the sequence as it would come back, and restore nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report the sequence as it would come back, and restore nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceRestoreReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found in Trash."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Validation failed."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Restore a sequence from Trash",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/resume/": {
      "post": {
        "description": "Every contact picks up from where they stopped; nothing restarts. Its held LinkedIn steps go back in line, and the approvals given while it was paused stand.",
        "operationId": "resume_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Resume a paused sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/senders/": {
      "get": {
        "operationId": "get_sequence_senders",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceSendersSetSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the senders a sequence sends as",
        "tags": [
          "sequences"
        ]
      },
      "put": {
        "description": "Replaces the whole set. A contact's first email goes from one of the chosen senders' connected mailboxes, and every later email from that same mailbox. Removing a sender from a launched sequence stops the live contacts its mailboxes email: no other mailbox emails them.",
        "operationId": "put_sequence_senders",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceSendersPutSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceSendersSetSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Choose the senders a sequence sends as",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/start-progress/": {
      "get": {
        "description": "How far a launch has got: `starting` counts the contacts due now plus those being worked on, and reaches 0 when the start is over; `tasks_waiting` counts this sequence's tasks waiting for someone's approval. Cheap enough to poll every two seconds right after a launch.",
        "operationId": "get_sequence_start_progress",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceStartProgressReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Follow a sequence's start",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/steps/{step_id}/browser-trials/": {
      "get": {
        "description": "The step's trials on one contact, newest first: each in line, running (its steps so far), or how it ended. An empty page when the step was never tried. Hidden values show no value here; `.../browser-trials/{trial_id}/reveal/` shows them, recorded.",
        "operationId": "list_browser_trials",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_BrowserTrialReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a Browser use step's trials",
        "tags": [
          "sequences"
        ]
      },
      "post": {
        "description": "Runs the step once, as it is saved, on one contact of the audience, on a draft, paused or running sequence, and answers the trial in line. Charged as a run is: the browser's minutes at the per-minute price, never more than a run's most, and nothing when its browser never opens. A trial never moves or enrols the contact, never writes a cell, never keeps a mailbox for the contact, and never counts in the step's numbers. The agent acts as the mailbox that emails the contact, else the one a run would assign them; `.../browser-trials/preview/` says who and the price first. One trial of a step at a time: asking while one is in line or running starts nothing and answers 409.",
        "operationId": "create_browser_trial",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BrowserTrialCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserTrialReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "The workspace has no credits left."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The step's trial is already in line or running; nothing started."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The step or the contact cannot be tried; the message says why."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Try a Browser use step on one contact",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/steps/{step_id}/browser-trials/preview/": {
      "post": {
        "description": "What trying the step on this contact would do, starting nothing: who the agent would act as (the mailbox that emails the contact, else the one a run would assign them) and the most it may charge. Refuses a step or a contact that cannot be tried, as the start would. While the step's own trial is in line or running it answers `already_running` and that trial, since a start would then start nothing.",
        "operationId": "preview_browser_trial",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BrowserTrialCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserTrialPreviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "The workspace has no credits left."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "The step or the contact cannot be tried; the message says why."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview trying a Browser use step on one contact",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/steps/{step_id}/preview/": {
      "get": {
        "description": "Render one step exactly as one contact would receive it, writing nothing and spending nothing. On an agent-written step this shows what is saved for that contact and step: words marked Looks good or pinned for them, else the sample saved for them; with nothing saved it answers `written` false, and `POST /sequences/{sequence_id}/steps/{step_id}/rows/{record_id}/samples/` has the agent write it. Without `mailbox_id`, the sender's variables are filled in as the sequence's first sender's, the sender a sample is written as. With `mix` above 0, a typed step's rotations pick another combination of their versions, to read the email the way other contacts get it; 0 is the contact's own.",
        "operationId": "preview_step",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "mailbox_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Mailbox Id"
            }
          },
          {
            "description": "0 shows each rotation's version as this contact gets it; another number picks another combination, as other contacts get it.",
            "in": "query",
            "name": "mix",
            "required": false,
            "schema": {
              "default": 0,
              "description": "0 shows each rotation's version as this contact gets it; another number picks another combination, as other contacts get it.",
              "maximum": 1000000,
              "minimum": 0,
              "title": "Mix",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RenderedMessageReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The audience is not configured yet."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Render a step for one contact",
        "tags": [
          "sequences"
        ]
      },
      "post": {
        "description": "The step as the contact would get it once the change set is applied, applying nothing and saving nothing. Nothing is written while the changes leave the step's words as they are or the contact keeps the words they have (`changed` false), or when another contact of `candidate_record_ids` is offered in place of one the changes do not reach. A step the agent writes is written again from the changes, spending one of the day's free previews per step written; the words are kept for 30 minutes for this contact and these changes, so another step's Preview and a test send read them and spend nothing.",
        "operationId": "preview_step_with_changes",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SequenceChangesStepPreviewSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SequenceChangesStepPreviewReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "description": "The sequence, the step, the contact, or a writing setup is gone."
          },
          "409": {
            "description": "The audience is not configured yet."
          },
          "422": {
            "description": "The changes set an Effort the catalog does not offer (`model_key`), or the agent wrote nothing usable with them (`step_id`, error type `draft_not_written`)."
          },
          "429": {
            "description": "Today's free agent-written previews are spent."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview one step for one contact with the waiting changes",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/steps/{step_id}/rows/{record_id}/feedback/": {
      "put": {
        "description": "The Builder's Looks good on the one step it shows. The email saved for this contact at this step becomes what sends to them, until the agent's writing or the contact's row changes, and the AI writing tab marks it Looks good. The contact's other emails are left as they are. Spends nothing; marking an email whose mark still stands changes nothing on it. With `message_id`, the mark lands only on those words. A learning a Needs work left proposed on this contact is saved, and the answer counts it in `saved_learnings`; like any saved learning, it writes again the waiting messages that it reaches, in Tasks and waiting to send. Refused while that Needs work's rewrite is still being written, or was refused, and, with `rev`, when the contact's feedback session moved on since it was read. Refused too where the Builder offers no Looks good: a step a person writes, a person's own words, a step already sent to the contact, or a real email the agent already wrote for them.",
        "operationId": "mark_step_looks_good",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          },
          {
            "description": "The email on screen, as the step's preview answered it in `message_id`. Given, the mark is refused when the words saved for the contact are no longer those; left out, it marks whatever is saved now.",
            "in": "query",
            "name": "message_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The email on screen, as the step's preview answered it in `message_id`. Given, the mark is refused when the words saved for the contact are no longer those; left out, it marks whatever is saved now.",
              "title": "Message Id"
            }
          },
          {
            "description": "The contact's feedback session `rev` as read. When sent, a session a note or an edit changed since is refused (409) and nothing is marked; left out, it saves the session as it stands.",
            "in": "query",
            "name": "rev",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The contact's feedback session `rev` as read. When sent, a session a note or an edit changed since is refused (409) and nothing is marked; left out, it saves the session as it stands.",
              "title": "Rev"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StepLooksGoodReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "Nothing is written for this contact at this step yet, the step is not the agent's, the words there are a person's own, the step already went to the contact or its real email is written, the email changed since `message_id` was read, the contact's row changed since it was written, the audience is not configured, a Needs work's rewrite of the contact is still being written or was refused, or the contact's feedback session moved on since the `rev` sent."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Mark one email the agent wrote for a contact Looks good",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/steps/{step_id}/rows/{record_id}/override/": {
      "delete": {
        "operationId": "delete_message_override",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "423": {
            "description": "The sequence is running."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Revert one contact to the step's template",
        "tags": [
          "sequences"
        ]
      },
      "get": {
        "operationId": "get_message_override",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageOverrideReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The sequence was not found, or this contact has no hand-edited message for the step: they get the step's template."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get one contact's hand-edited message for a step",
        "tags": [
          "sequences"
        ]
      },
      "put": {
        "description": "Stores rendered text, not a template: variables, AI snippets and spintax are not re-resolved over an override. Pause a running sequence to edit.",
        "operationId": "put_message_override",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MessageOverridePutSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageOverrideReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "423": {
            "description": "The sequence is running."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Pin the exact message one contact receives",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/steps/{step_id}/rows/{record_id}/samples/": {
      "post": {
        "description": "Have the agent write this contact's emails as samples, the way the real first send writes them, and answer this step as they would receive it. For a contact not written to yet the agent writes their whole sequence in one call and saves each step's words as a sample, kept on the sequence's AI writing tab; nobody receives a sample, and the real send is written fresh unless the thread is marked Looks good. A sample already saved for this step is answered as it is, unless `fresh` asks for the contact's emails to be written again; words marked Looks good, or a person's own words for the contact, stand and are answered as they are. Each step written counts against the workspace's daily preview allowance; it costs no credits. `GET /sequences/{sequence_id}/steps/{step_id}/preview/` shows what is saved without writing.",
        "operationId": "create_contact_samples",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ContactSamplesCreateSchema"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RenderedMessageReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The audience is not configured yet, or a person writes the step, which has no samples."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "429": {
            "description": "Today's free agent-written previews are spent."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Write one contact's samples",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/steps/{step_id}/test-send/": {
      "post": {
        "description": "Real mailbox, real signature, variables resolved; free of credits and analytics. A LinkedIn step arrives as an email with its exact text and no signature. With `changes`, the step is sent as it will read once those waiting changes are applied, which applies nothing: a step the agent writes goes out in the words its Preview wrote for this contact and these changes, kept for 30 minutes, and only when there are none is it written, spending one of the day's free previews per step written.",
        "operationId": "test_send",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "step_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Step Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestSendRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestSendResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "409": {
            "description": "The audience is not configured yet, or the real send would skip this contact (a missing column, or an agent-written body left empty)."
          },
          "422": {
            "description": "With `changes`: they set an Effort the catalog does not offer (`model_key`), or the agent wrote nothing usable with them (`step_id`, error type `draft_not_written`)."
          },
          "429": {
            "description": "Today's free agent-written previews are spent."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "The mailbox could not send."
          },
          "503": {
            "description": "The agent has not written this contact's message yet."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Send this step as a real test email",
        "tags": [
          "sequences"
        ]
      }
    },
    "/sequences/{sequence_id}/sync/": {
      "post": {
        "description": "Run the audience diff now and report what changed.\n\nEnrolment is event-driven: a table announces rows arriving, finishing or being deleted, and live audiences react to it. Nothing polls, and the dashboard offers no button for this. It survives as the recovery path (an audience bound while the sequence was paused, or one that missed an announcement) and for callers driving a sequence over the API.",
        "operationId": "sync_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "sequence_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sequence Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "expected_table_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Expected Table Id"
            }
          },
          {
            "in": "query",
            "name": "continuous_only",
            "required": false,
            "schema": {
              "default": false,
              "title": "Continuous Only",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyncSequenceResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Sync a sequence's enrolments now",
        "tags": [
          "sequences"
        ]
      }
    },
    "/subdomain-searches/": {
      "post": {
        "description": "Begin reading the public record of subdomains for a domain. Returns immediately with a pending search; poll the search endpoint until it reaches a terminal status. It usually answers in seconds, but a domain the fast index does not cover falls back to reading raw certificate logs, which is slow and frequently has to be retried. That is why this does not answer inline.",
        "operationId": "start_subdomain_search",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartSubdomainSearchRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubdomainSearchResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Not enough credits, or the plan does not include subdomain search."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Start a subdomain search",
        "tags": [
          "find-subdomains"
        ]
      }
    },
    "/subdomain-searches/{search_id}/": {
      "get": {
        "description": "Poll a search until its status is succeeded or failed. A failed search carries an error code and whether another attempt is worth making. With this upstream source, it usually is.",
        "operationId": "get_subdomain_search",
        "parameters": [
          {
            "in": "path",
            "name": "search_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Search Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubdomainSearchResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such subdomain search."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a subdomain search",
        "tags": [
          "find-subdomains"
        ]
      }
    },
    "/subdomain-searches/{search_id}/import/": {
      "post": {
        "description": "Land a finished search's hostnames into a new table, one row per hostname. Separate from the search itself so results can be reviewed before a table is committed.",
        "operationId": "create_table_from_subdomain_search",
        "parameters": [
          {
            "in": "path",
            "name": "search_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Search Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTableFromSubdomainSearchRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateTableFromSubdomainSearchResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Not enough credits, or the plan does not allow a table this size."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No such subdomain search or folder."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a table from a subdomain search",
        "tags": [
          "find-subdomains"
        ]
      }
    },
    "/table-enrichments/actions/": {
      "get": {
        "description": "The server-owned catalog of enrichment actions the picker renders. Sorted by category then display name; development-only actions are absent in production.",
        "operationId": "list_enrichment_actions",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_EnrichmentActionSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List enrichment actions",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/agent-tools/": {
      "get": {
        "description": "The enrichment tools a research agent can be given ('find_work_email', 'read_linkedin_profile'), with whether each can be switched on for this organisation. Every model affords every tool; what each adds to a row's price is on the model's lookup_credits_per_find.",
        "operationId": "list_enrichment_agent_tools",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_AgentToolAvailabilitySchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List agent tools",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/builtin-agent-templates/": {
      "get": {
        "description": "The built-in agents as copyable starting points, prompt and model included, so the agents page can seed a saved-agent editor from one. Every agent the picker offers this org, filtered by the same per-org visibility; `is_template` marks the curated few.",
        "operationId": "list_builtin_agent_templates",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_BuiltinAgentTemplateSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List built-in agent templates",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/columns/suggestions/": {
      "post": {
        "description": "Turn one plain-language sentence into a suggested AI-column configuration: display name, prompt with column references, output fields and a model suggestion. The suggestion seeds the editor and is not saved.",
        "operationId": "generate_enrichment_column",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateEnrichmentColumnRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrichmentColumnDraftSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest an enrichment column",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/mcp-servers/": {
      "get": {
        "description": "The organisation's MCP servers, alphabetical unless ordered otherwise.",
        "operationId": "list_mcp_servers",
        "parameters": [
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNameCreatedAtUpdatedAtId",
              "default": "name",
              "enum": [
                "name",
                "created_at",
                "updated_at",
                "id"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_McpServerReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List MCP servers",
        "tags": [
          "table-enrichments"
        ]
      },
      "post": {
        "description": "Register a tool server agents can attach.",
        "operationId": "create_mcp_server",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/McpServerCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/McpServerReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "description": "Server name already taken"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create an MCP server",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/mcp-servers/authorize/": {
      "post": {
        "description": "Begin (or redo) the OAuth flow for one catalog entry and return the authorization URL to send the browser to. Reconnecting uses the same call. The server is only added once the callback finishes the flow.",
        "operationId": "start_mcp_oauth_connect",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/McpOauthConnectRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/McpOauthConnectResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Unknown catalog entry"
          },
          "422": {
            "description": "The entry cannot be connected"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "The server or its authorization service is unreachable"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Start an MCP OAuth connection",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/mcp-servers/callback/": {
      "post": {
        "description": "Exchange the provider redirect's code for the grant, persist the connection, and return the server with a live probe of its tools.",
        "operationId": "finish_mcp_oauth_connect",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/McpOauthCallbackRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/McpOauthCallbackResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Unknown catalog entry"
          },
          "422": {
            "description": "The sign-in attempt expired or was rejected"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "description": "The authorization service is unreachable"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Finish an MCP OAuth connection",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/mcp-servers/catalog/": {
      "get": {
        "description": "The curated hosted MCP servers, merged with this organisation's connection state per tile.",
        "operationId": "list_mcp_catalog",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_McpCatalogTileSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the MCP connect catalog",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/mcp-servers/{mcp_server_id}/": {
      "delete": {
        "description": "Delete an MCP server; it detaches from every agent that had it.",
        "operationId": "delete_mcp_server",
        "parameters": [
          {
            "in": "path",
            "name": "mcp_server_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mcp Server Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "MCP server not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete an MCP server",
        "tags": [
          "table-enrichments"
        ]
      },
      "patch": {
        "description": "Partially update an MCP server. `headers`, when present, replaces the whole header dict. Agents pick the change up on their next run.",
        "operationId": "update_mcp_server",
        "parameters": [
          {
            "in": "path",
            "name": "mcp_server_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mcp Server Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/McpServerUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/McpServerReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "MCP server not found"
          },
          "422": {
            "description": "Server name already taken"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update an MCP server",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/mcp-servers/{mcp_server_id}/verify/": {
      "post": {
        "description": "Probe the server live with its stored configuration and return the tools it offers. An unreachable server is a 200 with ok=false, because the probe's outcome is the payload, not an API failure.",
        "operationId": "verify_mcp_server",
        "parameters": [
          {
            "in": "path",
            "name": "mcp_server_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mcp Server Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/McpServerVerifyResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "MCP server not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Verify an MCP server",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/models/": {
      "get": {
        "description": "The user-facing model catalog: named tiers with per-row credit costs, cheapest first. The default is marked.",
        "operationId": "list_enrichment_models",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_EnrichmentModelSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List enrichment models",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/": {
      "get": {
        "description": "The organisation's saved agent personas, alphabetical unless ordered otherwise. Each one says whether the person asking starred it and when they last opened it: both are that person's own. `favorite` keeps only the agents they starred; `recent` keeps only the ones they opened, the latest open first, at most 20. An API key has no person, so both read empty for it. `search` keeps the agents whose name, description or prompt holds the text, ignoring case.",
        "operationId": "list_saved_agents",
        "parameters": [
          {
            "in": "query",
            "name": "is_template",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Is Template"
            }
          },
          {
            "in": "query",
            "name": "favorite",
            "required": false,
            "schema": {
              "default": false,
              "title": "Favorite",
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "recent",
            "required": false,
            "schema": {
              "default": false,
              "title": "Recent",
              "type": "boolean"
            }
          },
          {
            "description": "Case-insensitive text the agent's name, description or prompt holds; the prompt reads each input by its name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Case-insensitive text the agent's name, description or prompt holds; the prompt reads each input by its name.",
              "title": "Search"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNameCreatedAtUpdatedAtId",
              "default": "name",
              "enum": [
                "name",
                "created_at",
                "updated_at",
                "id"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SavedAgentReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List saved agents",
        "tags": [
          "table-enrichments"
        ]
      },
      "post": {
        "description": "Create an org-level reusable agent: declared inputs, a prompt referencing them, output shape, model and tools. Agent columns can point at it.",
        "operationId": "create_saved_agent",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedAgentCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a saved agent",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/inputs/suggestions/": {
      "post": {
        "description": "Read a prompt, work out which values have to change from row to row, declare them, and return the prompt with each literal mention replaced by a reference to what was declared. Inputs the agent already declares keep their ids and are never dropped. Nothing is stored. The caller drops the result into the editor and decides what to keep. Counts against the workspace's daily AI Assistant allowance; a refused call answers 429.",
        "operationId": "generate_saved_agent_inputs",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedAgentInputGenerateRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentInputGenerateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantUnavailableResponseSchema"
                }
              }
            },
            "description": "The workspace's AI Assistant allowance is spent, or the AI Assistant is paused"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Declare the per-row inputs a prompt needs",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/outputs/suggestions/": {
      "post": {
        "description": "Read a prompt and propose the typed fields the agent should return. Nothing is stored. The caller drops the result into the editor and decides what to keep. Counts against the workspace's daily AI Assistant allowance; a refused call answers 429.",
        "operationId": "generate_saved_agent_outputs",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedAgentOutputGenerateRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentOutputGenerateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantUnavailableResponseSchema"
                }
              }
            },
            "description": "The workspace's AI Assistant allowance is spent, or the AI Assistant is paused"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Derive an output schema from a prompt",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/prompt/suggestions/": {
      "post": {
        "description": "Take the prompt as it stands in the editor plus a change the user described in their own words, and return the full revised prompt with a one-sentence summary of what changed. The prompt is not stored. The caller decides whether to keep the revision. Counts against the workspace's daily AI Assistant allowance; a refused call answers 429.",
        "operationId": "edit_saved_agent_prompt",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedAgentPromptEditRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentPromptEditResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssistantUnavailableResponseSchema"
                }
              }
            },
            "description": "The workspace's AI Assistant allowance is spent, or the AI Assistant is paused"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest a revised agent prompt from a natural-language change",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/prompt/suggestions/stream/": {
      "post": {
        "description": "The streaming form of the revision: the same full revised prompt and one-sentence summary, sent as Server-Sent Events. The first frame is `turn`, carrying the `edit_id` a Stop is sent to; then a `step` frame for each thing the assistant actually did (`rewrite_prompt` for the model call, `finish` with the line counts), each with its measured duration; then one `result` frame with the revision as the plain route returns it.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `limit` or `paused` when the workspace's daily AI Assistant allowance refused the revision, `stopped` when the caller stopped it, and no reason for anything else. Counts against the allowance; a stopped or failed revision gives its turn back.\n\nClosing the connection does not stop the revision; the Stop route does. Requires a signed-in person; the plain route serves API keys.",
        "operationId": "stream_edit_saved_agent_prompt",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedAgentPromptEditRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentPromptEditResponseSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of Server-Sent Events; the final `result` frame's `data` is the revised prompt."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest a revised agent prompt from a natural-language change, streaming the work",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/prompt/suggestions/{edit_id}/stop/": {
      "post": {
        "description": "Ask the revision streaming under `edit_id` (its first frame) to stop. Cooperative: the revision reads the request once a second while the model writes and again before the prompt is handed back, and ends there, its trail on the last step with `Stopped by you` on the one it interrupted and its stream in an `error` frame with reason `stopped`. A revision that has already landed is unaffected. The turn a stopped revision claimed is given back.",
        "operationId": "stop_saved_agent_prompt_edit",
        "parameters": [
          {
            "in": "path",
            "name": "edit_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Edit Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentPromptEditStopResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stop an agent prompt revision that is being streamed",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/suggestions/stream/": {
      "post": {
        "description": "Expand a natural-language task into a complete agent draft (a structured prompt with {{input}} placeholders, a name and icon, typed output fields and sample test cases), streamed as Server-Sent Events. The first frame is `turn`, carrying the `generation_id` a Stop is sent to; then a `step` frame for each thing the builder actually did (`read_context` when the workspace has written its business context, `write_instructions`, `choose_outputs`, `write_examples`, `finish`), each with its measured duration; then one `result` frame with the draft.\n\nFailures arrive as an `error` frame, because the stream has already answered 200: reason `limit` or `paused` when the workspace's daily AI Assistant allowance refused the build, `stopped` when the caller stopped it, and no reason for anything else. Counts against the allowance; a stopped or failed build gives its turn back.\n\nClosing the connection does not stop the build; the Stop route does.",
        "operationId": "stream_generate_saved_agent",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedAgentGenerateRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentGeneratedDraftSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of Server-Sent Events; the final `result` frame's `data` is the generated draft."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest an agent from a task, streaming its work",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/suggestions/{generation_id}/stop/": {
      "post": {
        "description": "Ask the build streaming under `generation_id` (its first frame) to stop. Cooperative: the build reads the request once a second while the model writes and again before each model call, and ends there, its trail on the last step and its stream in an `error` frame with reason `stopped`. A build that has already finished is unaffected. The turn a stopped build claimed is given back.",
        "operationId": "stop_saved_agent_generation",
        "parameters": [
          {
            "in": "path",
            "name": "generation_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Generation Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentGenerationStopResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stop an agent suggestion that is being written",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/": {
      "delete": {
        "description": "Delete a saved agent. Columns pointing at it keep their reference and fail visibly on their next run.",
        "operationId": "delete_saved_agent",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a saved agent",
        "tags": [
          "table-enrichments"
        ]
      },
      "get": {
        "description": "Get one saved agent by ID.",
        "operationId": "get_saved_agent",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a saved agent",
        "tags": [
          "table-enrichments"
        ]
      },
      "patch": {
        "description": "Partially update a saved agent. Columns pointing at it pick the change up on their next run. The person's own star is PUT /table-enrichments/saved-agents/{saved_agent_id}/favorite/.",
        "operationId": "update_saved_agent",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedAgentUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a saved agent",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/apply/": {
      "post": {
        "description": "Add a saved agent to the table named in the body as a linked enrichment column: a parent agent column plus a child column per selected output, each named after its FIELD and folded into one group labelled with the agent's name. Created unrun; pass `run_rows` to run that many first rows straight away. Bounded batches only: no run-all. A dry run drafts the parent, each child column and the first run's price, refuses what the real call would refuse (the column limit, a taken name, a balance that cannot cover `run_rows`) and answers the parent as it would be, under a provisional id.",
        "operationId": "add_agent_to_table",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddAgentToTableRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Add a saved agent to a table",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/favorite/": {
      "delete": {
        "description": "Remove this agent from the CALLING USER's Favorites. Per person: a teammate's star stays. Unstarring an agent that is not starred changes nothing and counts none.",
        "operationId": "delete_saved_agent_favorite",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Unstar a saved agent",
        "tags": [
          "table-enrichments"
        ]
      },
      "put": {
        "description": "Star this agent for the CALLING USER, which is what the Agents list's Favorites holds. Per person: starring an agent does not star it for a teammate, and never versions the agent. Starring a starred agent changes nothing. Unstarring is the delete of the same address.",
        "operationId": "set_saved_agent_favorite",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentUserPrefsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Star a saved agent",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/mcp-servers/": {
      "get": {
        "description": "The MCP servers attached to this saved agent, alphabetical.",
        "operationId": "list_agent_mcp_servers",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentMcpServersSetSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an agent's attached MCP servers",
        "tags": [
          "table-enrichments"
        ]
      },
      "put": {
        "description": "Replace the saved agent's attached MCP servers with exactly the given set. Every server must belong to the organisation.",
        "operationId": "set_agent_mcp_servers",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AgentMcpServersPutSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentMcpServersSetSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent or an MCP server not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Set an agent's attached MCP servers",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/open/": {
      "post": {
        "description": "Note that the CALLING USER just opened this agent, which is what feeds their Recent on the Agents list. Best-effort: clients fire it on open and ignore the result. Never touches the star: opening an agent says nothing about whether the person wants it starred.",
        "operationId": "record_saved_agent_view",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentUserPrefsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Record that the caller opened this agent",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/sample-rows/": {
      "put": {
        "description": "Replace the example input rows the agent's Train screen offers again, with a set `GET /agent-training/sample-rows/suggestions/` found. Suggestion memory, not configuration: the agent's version never changes. An empty `rows` forgets the set.",
        "operationId": "set_saved_agent_sample_rows",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SavedAgentSampleRowsSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentSampleRowsSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Remember a saved agent's example rows",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/usage/": {
      "get": {
        "description": "The table columns deployed from this saved agent, across all tables, oldest first, a page at a time. This is what a central edit to the agent will touch.",
        "operationId": "get_saved_agent_usage",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SavedAgentUsageReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Where a saved agent is used",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/versions/": {
      "get": {
        "description": "The agent's version history, newest first. Every configuration save appends a version; a person's star never versions.",
        "operationId": "list_saved_agent_versions",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SavedAgentVersionReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a saved agent's versions",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-enrichments/saved-agents/{saved_agent_id}/versions/{version}/revert/": {
      "post": {
        "description": "Apply a prior version's configuration as a new save. The revert itself becomes the next version, keeping history linear.",
        "operationId": "revert_saved_agent",
        "parameters": [
          {
            "in": "path",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "version",
            "required": true,
            "schema": {
              "title": "Version",
              "type": "integer"
            }
          },
          {
            "description": "Report what the revert would leave, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what the revert would leave, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SavedAgentReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Saved agent or version not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Revert a saved agent to a version",
        "tags": [
          "table-enrichments"
        ]
      }
    },
    "/table-imports/": {
      "post": {
        "description": "Upload a `.csv` or `.xlsx` file. The upload is kept as a pending import, and the response carries one suggested column per field (a name taken from the header row and a type every sampled value fits) plus a few raw rows so the user can judge those guesses.\n\nNO table, columns or rows exist yet. Review the mapping, edit it, and POST it to the commit endpoint to build the table.\n\nThe format is decided by the file's own first bytes, not by its name or its declared content type, both of which are client-supplied. A workbook is read one sheet at a time: `sheet_names` lists the rest, and updating the import with another `sheet` re-reads the same upload from it.\n\nRejects a file that is too large or too wide, so an import that cannot succeed fails before it costs a table name. A file with more rows than the plan allows is NOT rejected: `importable_row_count` comes back below `estimated_row_count` and the import takes the file's first rows.",
        "operationId": "create_table_import_csv",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_create_table_import_csv"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableImportPreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Upload a CSV or Excel file as a pending import",
        "tags": [
          "table-imports"
        ]
      }
    },
    "/table-imports/{import_id}/": {
      "get": {
        "description": "Poll an import's progress. `imported_rows` climbs against `total_rows` while the load runs; `status` reaches `succeeded` or `failed` and stays there.\n\n`failed_rows` is the exact count of rows that could not be written, while `row_errors` carries only a capped sample of them for display.",
        "operationId": "get_table_import_csv",
        "parameters": [
          {
            "in": "path",
            "name": "import_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Import Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableImportJobResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Import not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a CSV import's status",
        "tags": [
          "table-imports"
        ]
      },
      "patch": {
        "description": "Read the workbook that was already uploaded from another of its sheets, and return a fresh preview. The upload is not sent again: the file is already stored, and it can be large.\n\nEvery column is inferred from scratch, so the mapping in the response REPLACES the one being edited rather than merging into it. Two sheets share nothing but a file.\n\nOnly a pending import can change sheet; once committed, the table exists and its columns are fixed.",
        "operationId": "select_table_import_sheet",
        "parameters": [
          {
            "in": "path",
            "name": "import_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Import Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableImportSheetRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableImportPreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Import not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Re-read a pending upload from a different sheet",
        "tags": [
          "table-imports"
        ]
      }
    },
    "/table-imports/{import_id}/columns/{source_index}/distribution/": {
      "get": {
        "description": "Read exact value counts, percentages, empty and distinct counts across all data rows of an uploaded CSV or the selected XLSX sheet, before row caps: the top 20 values and an explicit other_count, with the column's name. source_index is zero-based. Whitespace-only values are empty; other values keep their raw spelling. Blank data rows are skipped as in the import. The raw values are read a page at a time from the column's values.",
        "operationId": "read_table_import_column_distribution",
        "parameters": [
          {
            "in": "path",
            "name": "import_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Import Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "source_index",
            "required": true,
            "schema": {
              "title": "Source Index",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileColumnDistributionSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Column or source not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read an import column's value distribution",
        "tags": [
          "table-imports"
        ]
      }
    },
    "/table-imports/{import_id}/columns/{source_index}/values/": {
      "get": {
        "description": "List the raw values of one column of an uploaded CSV or the selected XLSX sheet, in file order, each with the data row it is in: exactly as the file spells them, uncoerced. source_index is zero-based. Blank data rows are skipped as in the import. How the values are spread is the column's distribution.",
        "operationId": "read_table_import_column_values",
        "parameters": [
          {
            "in": "path",
            "name": "import_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Import Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "source_index",
            "required": true,
            "schema": {
              "title": "Source Index",
              "type": "integer"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForNumber",
              "default": "number",
              "enum": [
                "number"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ImportColumnValueSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Column or source not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List an import column's raw values",
        "tags": [
          "table-imports"
        ]
      }
    },
    "/table-imports/{import_id}/commit/": {
      "post": {
        "description": "Create the table and its columns from the reviewed mapping, then start the row load in the background.\n\nThe table exists as soon as this returns, so the client can navigate to it immediately and watch rows arrive. Poll the job to follow progress.\n\nCommitting twice is refused: the second call finds the import already running rather than creating a second table.",
        "operationId": "commit_table_import_csv",
        "parameters": [
          {
            "in": "path",
            "name": "import_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Import Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableImportCommitRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableImportJobResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Plan table limit reached. Upgrade to create more tables."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Import or folder not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create the table and start loading its rows",
        "tags": [
          "table-imports"
        ]
      }
    },
    "/table-writeback/capabilities/": {
      "get": {
        "description": "The legal write actions (including composite create-or-update), the fields records can be matched on, the supported write modes, and whether matching is possible at all: everything the export editor's action, match-key and write-mode controls are driven by.\n\nProbes the LIVE connection, so expired credentials fail here with a message about the connection rather than at run time.",
        "operationId": "get_write_capabilities",
        "parameters": [
          {
            "in": "query",
            "name": "integration_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Integration Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "record_type",
            "required": true,
            "schema": {
              "title": "Record Type",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteCapabilitiesSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Derive what one destination record type can do",
        "tags": [
          "table-writeback"
        ]
      }
    },
    "/table-writeback/preview/": {
      "post": {
        "description": "Render each row's outgoing payload exactly as a real run would, ask the destination (READ-ONLY) whether the row matches an existing record, and report what a real run would do: create, update or skip.\n\nNOTHING is written. The write half of the executor is unreachable from this path.",
        "operationId": "preview_export",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExportPreviewRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExportPreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Dry-run an export against real rows",
        "tags": [
          "table-writeback"
        ]
      }
    },
    "/tables/": {
      "get": {
        "description": "List the organisation's tables with cursor pagination and optional filters. Every folder is reached unless folder_id, within_folder_id or top_level narrows it, and archived tables are left out unless archived says otherwise. Each table says the folders on the way to it.\n\nThe same list serves the shortcuts: favorite (the caller's starred tables), recent (what the caller opened lately, newest first), trashed (the tables in Trash), unfiled (tables folders could not file by themselves), untouched (tables nobody has opened or changed for a long while), with_lead_search (tables that already have a lead search) and integration_id (the tables a connection fills, which stop updating if it is disconnected). They narrow one another and the rest of the filters. recent and untouched answer their whole short list as one page.\n\norder_by=last_viewed_at orders by when the caller last opened each table; a table they never opened (every table, for an API key) sits at the moment it was made. search matches the name or the description.",
        "operationId": "list_tables",
        "parameters": [
          {
            "in": "query",
            "name": "archived",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ArchivedScope",
              "default": "exclude",
              "description": "exclude (the default) leaves archived tables out, as the list does; include lists them beside the rest, as search does; only lists them alone, as the Archived view does."
            },
            "description": "exclude (the default) leaves archived tables out, as the list does; include lists them beside the rest, as search does; only lists them alone, as the Archived view does."
          },
          {
            "in": "query",
            "name": "created_at__after",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by created_at after this instant (ISO 8601).",
              "title": "Created At  After"
            },
            "description": "Filter by created_at after this instant (ISO 8601)."
          },
          {
            "in": "query",
            "name": "created_at__before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by created_at before this instant (ISO 8601).",
              "title": "Created At  Before"
            },
            "description": "Filter by created_at before this instant (ISO 8601)."
          },
          {
            "in": "query",
            "name": "favorite",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the tables the CALLING USER starred: a teammate's favourites are a different list, and an API key has none.",
              "title": "Favorite",
              "type": "boolean"
            },
            "description": "Only the tables the CALLING USER starred: a teammate's favourites are a different list, and an API key has none."
          },
          {
            "in": "query",
            "name": "folder_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the tables directly in this folder. Leave it and top_level out to reach every folder, as search does.",
              "title": "Folder Id"
            },
            "description": "Only the tables directly in this folder. Leave it and top_level out to reach every folder, as search does."
          },
          {
            "in": "query",
            "name": "integration_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the tables this connection fills: their import source pages records from it. Disconnecting it deletes those sources and their import history, so these are the tables that would stop updating.",
              "title": "Integration Id"
            },
            "description": "Only the tables this connection fills: their import source pages records from it. Disconnecting it deletes those sources and their import history, so these are the tables that would stop updating."
          },
          {
            "in": "query",
            "name": "name__contains",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by name (case-insensitive contains).",
              "title": "Name  Contains"
            },
            "description": "Filter by name (case-insensitive contains)."
          },
          {
            "in": "query",
            "name": "owner_user_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 64,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter to tables this workspace member owns.",
              "title": "Owner User Id"
            },
            "description": "Filter to tables this workspace member owns."
          },
          {
            "in": "query",
            "name": "recent",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the tables the CALLING USER opened lately, most recently opened first. The whole short list comes back as one page, because 'recent' stops meaning anything once it holds everything: limit, order and cursors do not apply.",
              "title": "Recent",
              "type": "boolean"
            },
            "description": "Only the tables the CALLING USER opened lately, most recently opened first. The whole short list comes back as one page, because 'recent' stops meaning anything once it holds everything: limit, order and cursors do not apply."
          },
          {
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only tables whose name or description holds this text, any case, anywhere in it: what the Tables list's search box matches.",
              "title": "Search"
            },
            "description": "Only tables whose name or description holds this text, any case, anywhere in it: what the Tables list's search box matches."
          },
          {
            "in": "query",
            "name": "top_level",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the tables in no folder: the top level of the Tables list.",
              "title": "Top Level",
              "type": "boolean"
            },
            "description": "Only the tables in no folder: the top level of the Tables list."
          },
          {
            "in": "query",
            "name": "trashed",
            "required": false,
            "schema": {
              "default": false,
              "description": "The tables in Trash instead of the live ones. Each can be restored in full, or destroyed early with permanently on its delete; otherwise the retention sweep destroys it once it is old enough. A table that went to Trash with its folder is not listed: the folder is, under the trashed folders, and it comes back with its folder.",
              "title": "Trashed",
              "type": "boolean"
            },
            "description": "The tables in Trash instead of the live ones. Each can be restored in full, or destroyed early with permanently on its delete; otherwise the retention sweep destroys it once it is old enough. A table that went to Trash with its folder is not listed: the folder is, under the trashed folders, and it comes back with its folder."
          },
          {
            "in": "query",
            "name": "unfiled",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only tables that carried more than one tag when folders replaced tags, so could not be filed by themselves. Each says its former tags; moving it anywhere, the top level included, files it.",
              "title": "Unfiled",
              "type": "boolean"
            },
            "description": "Only tables that carried more than one tag when folders replaced tags, so could not be filed by themselves. Each says its former tags; moving it anywhere, the top level included, files it."
          },
          {
            "in": "query",
            "name": "unowned",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only tables that nobody owns.",
              "title": "Unowned",
              "type": "boolean"
            },
            "description": "Only tables that nobody owns."
          },
          {
            "in": "query",
            "name": "untouched",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only tables nobody in the workspace has opened or changed for 60 days, longest untouched first: what the list suggests archiving. A suggestion only; nothing here archives anything. The whole short list comes back as one page: limit, order and cursors do not apply.",
              "title": "Untouched",
              "type": "boolean"
            },
            "description": "Only tables nobody in the workspace has opened or changed for 60 days, longest untouched first: what the list suggests archiving. A suggestion only; nothing here archives anything. The whole short list comes back as one page: limit, order and cursors do not apply."
          },
          {
            "in": "query",
            "name": "with_lead_search",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only tables that already have a lead search on them. A table has at most one, so a picker offering a destination can show these as unavailable up front.",
              "title": "With Lead Search",
              "type": "boolean"
            },
            "description": "Only tables that already have a lead search on them. A table has at most one, so a picker offering a destination can show these as unavailable up front."
          },
          {
            "in": "query",
            "name": "within_folder_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the tables in this folder or any folder under it, at any depth: where the Tables list's search, presets, views, and owner filter look inside an open folder.",
              "title": "Within Folder Id"
            },
            "description": "Only the tables in this folder or any folder under it, at any depth: where the Tables list's search, presets, views, and owner filter look inside an open folder."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAtNameOwnerUserIdLastViewedAt",
              "default": "created_at",
              "enum": [
                "id",
                "created_at",
                "updated_at",
                "name",
                "owner_user_id",
                "last_viewed_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List tables",
        "tags": [
          "tables"
        ]
      },
      "post": {
        "description": "Create a table: a blank one, one filled by a lead search, or one fed by a connected tool. kind says which, and the part of the body of that name carries the rest.\n\nA blank table gets its starter canvas: one manual text column (New column) and a screenful of empty rows. One request transaction, atomic; the default column is manual, so no recompute run is requested. Leave the name out to get the next free name: \"New table\", then \"New table (2)\" and onward. The person creating it owns it, and folder_id makes it inside that folder.\n\nA lead search runs and lands its results in the new table. Each chosen enrichment becomes a column on it. A people search may choose none; every other search needs at least one. The row count is capped per search and further clamped by the plan's rows-per-table limit. A table sent without a name is named after the search. A people search leaves out the people already in the workspace's other tables unless include_people_already_in_tables is set, and says how many it skipped. The answer also names a table the same search built before, when one still exists.\n\nA connected tool creates the table, its imported-record column and a few extracted columns, then starts loading rows in the background. The table exists as soon as this returns, so the client can open it and watch rows arrive. Only a signed-in person can import from a connected tool.",
        "operationId": "create_table",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableCreatedSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Plan table limit reached, or not enough credits to enrich the rows a lead search would land. Upgrade to create more tables."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder or integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderFailureResponseSchema"
                }
              }
            },
            "description": "The lead database or the connected tool refused the request."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a table",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/bulk/": {
      "patch": {
        "description": "Change the same fields of many tables in one request: put them in a folder (folder_id, null for the top level of the Tables list), name who owns them (owner_user_id, null for nobody), or archive them or bring them back (archived). Owner means who to ask about a table: it grants and takes away no access, so anyone in the workspace may change it. Answers how many tables changed and which; one already as asked, missing or in Trash is left out.",
        "operationId": "bulk_update_tables",
        "parameters": [
          {
            "description": "Report which tables would change, and change none.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report which tables would change, and change none.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableBulkUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableBulkUpdateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "That person is not in this workspace."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change several tables at once",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/color-labels/": {
      "get": {
        "description": "Get what this organisation calls each column tint. Sparse: a colour that has not been renamed is absent, and the client shows its built-in name.",
        "operationId": "get_color_labels",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnColorLabelsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get column colour names",
        "tags": [
          "table-column-color-labels"
        ]
      },
      "patch": {
        "description": "Replace the organisation's column colour names. Send the whole set: a colour omitted, or given a blank name, reverts to its built-in name.",
        "operationId": "update_color_labels",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnColorLabelsUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnColorLabelsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rename column colours",
        "tags": [
          "table-column-color-labels"
        ]
      }
    },
    "/tables/folders/": {
      "get": {
        "description": "Every live folder in the workspace, at every level, by name. parent_id says where each one sits. Each says how many tables and folders it holds, and when the caller last opened a table in it. Paged by cursor in that order: the list, the breadcrumb and the move picker read every page.\n\ntrashed lists the folders somebody moved to Trash instead, newest first, each with how many tables went with it. A folder that went with its own parent is not listed.",
        "operationId": "list_table_folders",
        "parameters": [
          {
            "in": "query",
            "name": "trashed",
            "required": false,
            "schema": {
              "default": false,
              "description": "List the folders somebody moved to Trash instead of the live ones, newest first. A folder that went with its own parent is not listed.",
              "title": "Trashed",
              "type": "boolean"
            },
            "description": "List the folders somebody moved to Trash instead of the live ones, newest first. A folder that went with its own parent is not listed."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableFolderSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List folders",
        "tags": [
          "tables"
        ]
      },
      "post": {
        "description": "Make a folder, at the top level or inside parent_id. Leave the name out for \"Untitled folder\". Names are unique among a folder's live siblings, case aside. Whoever makes it owns it.",
        "operationId": "create_table_folder",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableFolderCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableFolderSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Parent folder not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Make a folder",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/folders/suggestions/": {
      "get": {
        "description": "Group the live tables on the list that sit in no folder, archived ones aside, by what they share: one built from another's lead search (built_from), a campaign code ending their names such as (EF-1) (campaign_code), or names that start the same up to a dash (shared_name). Each suggestion names a folder and two or more tables, each table in one suggestion at most, biggest first. folder_id names a folder of that name already at the top level. Nothing is moved: file a suggestion by making its folder and moving its tables into it. loose_table_count says how many tables sit in no folder.",
        "operationId": "suggest_table_folders",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableFolderSuggestionsSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest folders for the tables in no folder",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/folders/{folder_id}/": {
      "delete": {
        "description": "Move a folder to Trash with every folder and table in it, archived tables included, as Google Drive does. Trash lists the folder, and restoring it brings everything back together. Trash keeps it for the same 30 days as a table.\n\npermanently destroys a folder that is already in Trash instead, with every folder and table that went there with it, and every row those tables held. That cannot be undone.",
        "operationId": "delete_table_folder",
        "parameters": [
          {
            "in": "path",
            "name": "folder_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Folder Id",
              "type": "string"
            }
          },
          {
            "description": "Destroy a folder already in Trash for good, instead of trashing it.",
            "in": "query",
            "name": "permanently",
            "required": false,
            "schema": {
              "default": false,
              "description": "Destroy a folder already in Trash for good, instead of trashing it.",
              "title": "Permanently",
              "type": "boolean"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableFolderDeletedResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a folder",
        "tags": [
          "tables"
        ]
      },
      "patch": {
        "description": "Rename a folder, move it into another folder (parent_id, null for the top level) with everything in it, or change who owns it. A folder cannot move inside itself or one of its own folders.",
        "operationId": "update_table_folder",
        "parameters": [
          {
            "in": "path",
            "name": "folder_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Folder Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableFolderUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableFolderSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rename, move or re-own a folder",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/folders/{folder_id}/restore/": {
      "post": {
        "description": "Bring a folder back with every folder and table that went to Trash with it, where it was (the top level when its own folder is gone). A table whose name a live table has taken since stays in Trash, listed there on its own, and the answer names it.",
        "operationId": "restore_table_folder",
        "parameters": [
          {
            "in": "path",
            "name": "folder_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Folder Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would come back, and restore nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would come back, and restore nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableFolderTrashResultSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Folder not found in Trash"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Restore a folder from Trash",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/formula-functions/": {
      "get": {
        "description": "List every formula function: name, display label, and UI grouping category. The same for every organisation, and answered whole in one page.",
        "operationId": "get_function_catalog",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_FunctionCatalogEntrySchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the formula functions",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/length/": {
      "get": {
        "description": "Get the number of the organisation's tables under the same optional filters.",
        "operationId": "get_tables_count",
        "parameters": [
          {
            "description": "Filter by name (case-insensitive contains).",
            "in": "query",
            "name": "name__contains",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by name (case-insensitive contains).",
              "title": "Name  Contains"
            }
          },
          {
            "description": "Only tables whose name or description holds this text, any case, anywhere in it: what the Tables list's search box matches.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 255,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only tables whose name or description holds this text, any case, anywhere in it: what the Tables list's search box matches.",
              "title": "Search"
            }
          },
          {
            "description": "Filter by created_at after this instant (ISO 8601).",
            "in": "query",
            "name": "created_at__after",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by created_at after this instant (ISO 8601).",
              "title": "Created At  After"
            }
          },
          {
            "description": "Filter by created_at before this instant (ISO 8601).",
            "in": "query",
            "name": "created_at__before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by created_at before this instant (ISO 8601).",
              "title": "Created At  Before"
            }
          },
          {
            "description": "Filter to tables this workspace member owns.",
            "in": "query",
            "name": "owner_user_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 64,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter to tables this workspace member owns.",
              "title": "Owner User Id"
            }
          },
          {
            "description": "Only tables that nobody owns.",
            "in": "query",
            "name": "unowned",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only tables that nobody owns.",
              "title": "Unowned",
              "type": "boolean"
            }
          },
          {
            "description": "Only the tables directly in this folder. Leave it and top_level out to reach every folder, as search does.",
            "in": "query",
            "name": "folder_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the tables directly in this folder. Leave it and top_level out to reach every folder, as search does.",
              "title": "Folder Id"
            }
          },
          {
            "description": "Only the tables in no folder: the top level of the Tables list.",
            "in": "query",
            "name": "top_level",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the tables in no folder: the top level of the Tables list.",
              "title": "Top Level",
              "type": "boolean"
            }
          },
          {
            "description": "Only the tables in this folder or any folder under it, at any depth: where the Tables list's search, presets, views, and owner filter look inside an open folder.",
            "in": "query",
            "name": "within_folder_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the tables in this folder or any folder under it, at any depth: where the Tables list's search, presets, views, and owner filter look inside an open folder.",
              "title": "Within Folder Id"
            }
          },
          {
            "description": "exclude (the default) leaves archived tables out, as the list does; include lists them beside the rest, as search does; only lists them alone, as the Archived view does.",
            "in": "query",
            "name": "archived",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ArchivedScope",
              "default": "exclude",
              "description": "exclude (the default) leaves archived tables out, as the list does; include lists them beside the rest, as search does; only lists them alone, as the Archived view does."
            }
          },
          {
            "description": "Only the tables the CALLING USER starred: a teammate's favourites are a different list, and an API key has none.",
            "in": "query",
            "name": "favorite",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the tables the CALLING USER starred: a teammate's favourites are a different list, and an API key has none.",
              "title": "Favorite",
              "type": "boolean"
            }
          },
          {
            "description": "Only the tables the CALLING USER opened lately, most recently opened first. The whole short list comes back as one page, because 'recent' stops meaning anything once it holds everything: limit, order and cursors do not apply.",
            "in": "query",
            "name": "recent",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only the tables the CALLING USER opened lately, most recently opened first. The whole short list comes back as one page, because 'recent' stops meaning anything once it holds everything: limit, order and cursors do not apply.",
              "title": "Recent",
              "type": "boolean"
            }
          },
          {
            "description": "The tables in Trash instead of the live ones. Each can be restored in full, or destroyed early with permanently on its delete; otherwise the retention sweep destroys it once it is old enough. A table that went to Trash with its folder is not listed: the folder is, under the trashed folders, and it comes back with its folder.",
            "in": "query",
            "name": "trashed",
            "required": false,
            "schema": {
              "default": false,
              "description": "The tables in Trash instead of the live ones. Each can be restored in full, or destroyed early with permanently on its delete; otherwise the retention sweep destroys it once it is old enough. A table that went to Trash with its folder is not listed: the folder is, under the trashed folders, and it comes back with its folder.",
              "title": "Trashed",
              "type": "boolean"
            }
          },
          {
            "description": "Only tables that carried more than one tag when folders replaced tags, so could not be filed by themselves. Each says its former tags; moving it anywhere, the top level included, files it.",
            "in": "query",
            "name": "unfiled",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only tables that carried more than one tag when folders replaced tags, so could not be filed by themselves. Each says its former tags; moving it anywhere, the top level included, files it.",
              "title": "Unfiled",
              "type": "boolean"
            }
          },
          {
            "description": "Only tables nobody in the workspace has opened or changed for 60 days, longest untouched first: what the list suggests archiving. A suggestion only; nothing here archives anything. The whole short list comes back as one page: limit, order and cursors do not apply.",
            "in": "query",
            "name": "untouched",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only tables nobody in the workspace has opened or changed for 60 days, longest untouched first: what the list suggests archiving. A suggestion only; nothing here archives anything. The whole short list comes back as one page: limit, order and cursors do not apply.",
              "title": "Untouched",
              "type": "boolean"
            }
          },
          {
            "description": "Only tables that already have a lead search on them. A table has at most one, so a picker offering a destination can show these as unavailable up front.",
            "in": "query",
            "name": "with_lead_search",
            "required": false,
            "schema": {
              "default": false,
              "description": "Only tables that already have a lead search on them. A table has at most one, so a picker offering a destination can show these as unavailable up front.",
              "title": "With Lead Search",
              "type": "boolean"
            }
          },
          {
            "description": "Only the tables this connection fills: their import source pages records from it. Disconnecting it deletes those sources and their import history, so these are the tables that would stop updating.",
            "in": "query",
            "name": "integration_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only the tables this connection fills: their import source pages records from it. Disconnecting it deletes those sources and their import history, so these are the tables that would stop updating.",
              "title": "Integration Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the number of tables",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/owners/": {
      "get": {
        "description": "Every workspace member who owns a table on the list, with how many, most first. What the list's owner filter offers. The tables nobody owns are counted by the table count with unowned set.\n\nassignable lists every member of the workspace instead, by name with their email address, owners of nothing included: who a table or a folder can be given to with the bulk change. Paged by cursor in that order: read on with next_page_cursor.",
        "operationId": "list_table_owners",
        "parameters": [
          {
            "in": "query",
            "name": "assignable",
            "required": false,
            "schema": {
              "default": false,
              "description": "List every member of the workspace, owners of nothing included, instead of the members who own a table: who a table or a folder can be given to.",
              "title": "Assignable",
              "type": "boolean"
            },
            "description": "List every member of the workspace, owners of nothing included, instead of the members who own a table: who a table or a folder can be given to."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableOwnerReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List who owns tables",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/preview/": {
      "post": {
        "description": "Fetch a page of records and report what is in them: the fields they carry, example values, and which identifier rows would be matched on across refreshes.\n\nNOTHING is created here. Review it, then POST to the create endpoint.\n\n`fields` merges what the sampled records actually contained with what the provider says a record of this type can carry, so a field every sampled record happens to leave empty is still offered.",
        "operationId": "preview_table_import_integration",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableSourcePreviewRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableSourcePreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Integration not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Sample records before importing them",
        "tags": [
          "table-sources"
        ]
      }
    },
    "/tables/{table_id}/": {
      "delete": {
        "description": "Move a table to Trash. Nothing is destroyed: its columns, rows and cells all stay, the table simply stops appearing anywhere except the Trash listing, and it can be restored in full.\n\nThe table's name is freed immediately, so the same name can be reused at once. A retention sweep destroys trashed tables for good once they are old enough.\n\npermanently destroys a table that is already in Trash instead, along with every column, row and cell it holds. That cannot be undone, and it only works on a table that has already been trashed, so it can never be the first thing that happens to live data.",
        "operationId": "delete_table",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Destroy a table that is already in Trash for good, instead of trashing it.",
            "in": "query",
            "name": "permanently",
            "required": false,
            "schema": {
              "default": false,
              "description": "Destroy a table that is already in Trash for good, instead of trashing it.",
              "title": "Permanently",
              "type": "boolean"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a table",
        "tags": [
          "tables"
        ]
      },
      "get": {
        "description": "Get details of a specific table.",
        "operationId": "get_table",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get table details",
        "tags": [
          "tables"
        ]
      },
      "patch": {
        "description": "Partially update a table's name, description, switches or type (omitted fields are left untouched). No recompute run is requested. While a lead search for people or companies fills the table (`table_type_set_by_search`), its type is the search's: another type is refused until the search is removed.",
        "operationId": "update_table",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a table",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/{table_id}/cell-feedback/bulk/": {
      "patch": {
        "description": "Apply ONE thumbs up, and one optional note, to up to 1000 cells. The endpoint that makes rating a swept selection a single request instead of N. Lenient per cell: a selection spanning a column no agent writes rates the rest and counts the others in `skipped`, since a rectangular selection routinely crosses column kinds. Re-rating replaces the earlier verdict rather than adding a second one. A thumbs down is refused here: mark the cells Needs work with a reason through `POST /agent-learnings/thumbs-downs/`.",
        "operationId": "bulk_rate_cells",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CellFeedbackBulkRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CellFeedbackBulkResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rate many cells at once",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/columns/": {
      "delete": {
        "description": "Delete a set of columns as ONE delete: dependents among them never block it, which is what lets a whole column group (a fan-out's children depend on their parent) go in one request. Dependents outside the set still block, or are repointed with `replace_with_column_id`. A group whose last member is deleted is dissolved. Ids that are not on the table are ignored.",
        "operationId": "batch_delete_table_columns",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The columns to delete.",
            "in": "query",
            "name": "ids",
            "required": true,
            "schema": {
              "description": "The columns to delete.",
              "items": {
                "format": "uuid",
                "type": "string"
              },
              "maxItems": 100,
              "minItems": 1,
              "title": "Ids",
              "type": "array"
            }
          },
          {
            "description": "Repoint dependent columns outside the set at this column before deleting. Omit to refuse the delete while such dependents exist.",
            "in": "query",
            "name": "replace_with_column_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Repoint dependent columns outside the set at this column before deleting. Omit to refuse the delete while such dependents exist.",
              "title": "Replace With Column Id"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete several columns",
        "tags": [
          "table-columns"
        ]
      },
      "get": {
        "description": "List a table's columns in position order. Each column's hidden, pinned and width are the caller's own laid over the team's; its colour is the team's, and its `group_id` names the column group it sits in.",
        "operationId": "list_table_columns",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPositionIdCreatedAtUpdatedAt",
              "default": "position",
              "enum": [
                "position",
                "id",
                "created_at",
                "updated_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableColumnWithUIPrefsSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List table columns",
        "tags": [
          "table-columns"
        ]
      },
      "post": {
        "description": "Create a column. A formula column requests a column-added recompute run over all rows. The run appears on the next active-runs poll; the response never carries a run ID. Manual columns request nothing. A column linked to another table gets a column of its own on this table for every value in its `fields`, grouped under it.",
        "operationId": "create_table_column",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a table column",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/agent-input-mapping/suggestions/": {
      "get": {
        "description": "Suggest a table column for each of the agent's inputs by name similarity. This is the 'Suggest input mappings with AI' affordance.",
        "operationId": "suggest_agent_input_mappings",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The saved agent whose inputs to map onto the table.",
            "in": "query",
            "name": "saved_agent_id",
            "required": true,
            "schema": {
              "description": "The saved agent whose inputs to map onto the table.",
              "format": "uuid",
              "title": "Saved Agent Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentInputMappingSuggestionsResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or agent not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest input\u2192column mappings for an agent",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/credit-rates/": {
      "get": {
        "description": "For every paid column on the table (hidden ones included), the most one row can cost and what one row usually costs, read from what the same kind of cell has been charged before. An AI column is charged what each row used under its per-row maximum, so the usual figure is often well under the maximum; with no history yet the two are equal. Reads only; nothing is priced live. Answered whole in one page: there is at most one entry per column.",
        "operationId": "list_table_column_credit_rates",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ColumnCreditRateSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get what each paid column costs per row",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/groups/": {
      "get": {
        "description": "List a table's column groups, oldest first: each one's name, whether it is folded, its colour, its run condition, and its members in position order with the ones that stay visible while it is folded.",
        "operationId": "list_table_column_groups",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAtIdUpdatedAt",
              "default": "created_at",
              "enum": [
                "created_at",
                "id",
                "updated_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableColumnGroupReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List column groups",
        "tags": [
          "table-columns"
        ]
      },
      "post": {
        "description": "Create a column group over the given columns. They are pulled together at the leftmost member's position, keeping their current relative order, and the LAST member becomes the group's output: the column that stays visible when the group is collapsed. Groups are org-shared, like column order itself.",
        "operationId": "create_table_column_group",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnGroupCreateRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnGroupReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Group columns",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/groups/{group_id}/": {
      "delete": {
        "description": "Dissolve a column group, leaving its columns exactly where they are. To delete the group WITH its columns, delete every member by ids: the emptied group dissolves with them.",
        "operationId": "delete_table_column_group",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "group_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Group Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Column group not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Ungroup",
        "tags": [
          "table-columns"
        ]
      },
      "patch": {
        "description": "Rename a group, fold or expand it, or replace its membership wholesale. `members` is FULL-state: the entry order becomes the members' physical order, newly listed columns join the group, and current members left out are removed and land immediately after the block. A group always has at least one member and at least one output: an empty list is refused (ungroup to dissolve a group), and so is a list with no output flagged (mark another column as output first). Collapse and `ui_color` are purely presentational. Folded members' cells stay fetched, and a group's colour is its own, independent of any tint its member columns carry.",
        "operationId": "update_table_column_group",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "group_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Group Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnGroupUpdateRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnGroupReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Column group not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a column group",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/name/suggestions/": {
      "get": {
        "description": "Suggest a free display name for a column from a base name: the base name itself when no column on the table already has it, or the first free \"<base> (n)\" variant, counting from 2. Free and changes nothing, the same name a column created right after would take.",
        "operationId": "suggest_table_column_name",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The name to make unique.",
            "in": "query",
            "name": "base",
            "required": true,
            "schema": {
              "description": "The name to make unique.",
              "maxLength": 255,
              "minLength": 1,
              "title": "Base",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnNameSuggestionResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest a name for a new column",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/preview/": {
      "post": {
        "description": "Evaluate an unsaved formula definition over the table's first 25 rows with the same data-type derivation the save path uses. Nothing is persisted and no run is requested. Every other kind of definition, including a Use AI or agent enrichment, is rejected with a 422 whose issue type is `column_kind_not_previewable`: to see what one of those fills in, create the column and run it on its first few rows.",
        "operationId": "preview_table_column",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnPreviewRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnPreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview a column definition",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/reorder/": {
      "post": {
        "description": "Reorder a table's columns. The request must contain every column of the table exactly once. Cosmetic: no version bumps and no recompute run. Pass `group_membership` to move columns in or out of a column group in the same request, which is what dragging a column into a group does: the new order and the new membership land together, so the group is never momentarily split. Answers every column in its new place.",
        "operationId": "reorder_table_columns",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnReorderRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnReorderResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Reorder table columns",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/suggestions/": {
      "post": {
        "description": "Build a formula definition from a natural-language instruction. The generated chain is validated with the same reference and type derivation the save path uses, then returned UNSAVED for review. Feed it to the preview endpoint or the create endpoint unchanged. A rejected attempt is retried once with the validation error fed back. A few sample rows are sent to the model as context. When the request asks for data the table's columns do not hold, no formula is invented: the response is a 422 whose issue type is `formula_not_supported` and whose message explains what is missing.",
        "operationId": "generate_table_column",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnGenerateRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnGenerateResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Generate a formula column from a description",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/{column_id}/": {
      "delete": {
        "description": "Delete a column. Blocked while other formula columns depend on it, unless `replace_with_column_id` names the column their references should point at instead. The dependents are rewritten first, then the delete proceeds. Cancels ONLY the column's own lineage run; other active runs keep running and skip the deleted column. To delete a column together with its dependents (a whole column group, say), delete them together by ids, where dependents among them never block it.",
        "operationId": "delete_table_column",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          },
          {
            "description": "Repoint dependent columns' references at this column before deleting. Omit to refuse the delete while dependents exist.",
            "in": "query",
            "name": "replace_with_column_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Repoint dependent columns' references at this column before deleting. Omit to refuse the delete while dependents exist.",
              "title": "Replace With Column Id"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a table column",
        "tags": [
          "table-columns"
        ]
      },
      "patch": {
        "description": "Partially update a column (omitted fields are left untouched). The kind is immutable. A formula definition change requests a column-edited recompute run. It appears on the next active-runs poll; the response carries only the requires_recompute flag, never a run ID. Cosmetic edits and manual default_value edits request nothing. A type change that stores values differently converts every value it can; cleared_count is how many it could not convert and left blank, which the retype preview forecasts beforehand. On a column linked to another table, every value in `fields` has a column of its own on this table: a value added gains one, and a value taken out of `fields` deletes its column.",
        "operationId": "update_table_column",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnUpdateResultSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a table column",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/{column_id}/distribution/": {
      "get": {
        "description": "Get exact value frequencies across every live row of a table, independent of view filters or loaded pages. Returns total, empty and distinct counts, the 20 most common values with counts and percentages of all rows, and other_count for nonempty values outside that list. Null, missing and whitespace-only text cells are empty; zero and false are values. Objects and arrays are whole values.",
        "operationId": "get_table_column_distribution",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValueDistributionSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Column or source not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a table column's value distribution",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/{column_id}/pointing-rows/": {
      "get": {
        "description": "For a column that counts the rows of another table pointing here: the first 25 of those rows that point at one row of this table, in the other table's order, each with what it is listed by. Answered whole in one page.",
        "operationId": "list_pointing_rows",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          },
          {
            "description": "The row of this table they point at.",
            "in": "query",
            "name": "record_id",
            "required": true,
            "schema": {
              "description": "The row of this table they point at.",
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_PointingRowReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table, column or row list not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the rows pointing at one row",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/{column_id}/preview/": {
      "get": {
        "description": "Report what changing a column's type would do to the values already in it, without changing anything. When the type is changed, each value is converted where the new type can read it: numbers, checkboxes, dates and lists become text (\"42\", \"true\", \"2026-09-24\", \"Hot, Warm\"), text like \"1,234\" becomes a number, \"yes\" or \"no\" becomes a checkbox, and comma separated text becomes a list. cleared_count is how many values the new type cannot read, which the change would leave blank. A change between types that store the same way, like text to URL, clears nothing.",
        "operationId": "preview_table_column_retype",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          },
          {
            "description": "The type the column would change to.",
            "in": "query",
            "name": "column_type",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/TableColumnType",
              "description": "The type the column would change to."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnRetypePreviewResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview a column type change",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/{column_id}/promote/": {
      "post": {
        "description": "Create a formula column that reads one declared output field out of a multi-field enrichment's payload. The child is typed by the field's declared type, dependency-linked to its parent, free to recompute, and immediately backfilled by its column-added run. With target_column_id, the field's current values instead overwrite an existing manual column. Destructive, and refused without confirm_overwrite.",
        "operationId": "promote_enrichment_field",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnPromoteFieldRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Promote an enrichment output field into its own column",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/{column_id}/push-summary/": {
      "get": {
        "description": "Counts from the export ledger (one entry per cell) answering the verification question directly: how many of this table's rows were created at the destination versus updated there, and when the newest push happened. Empty for a column that has never pushed.",
        "operationId": "get_push_summary",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PushSummarySchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Summarise what an export column has pushed",
        "tags": [
          "table-writeback"
        ]
      }
    },
    "/tables/{table_id}/columns/{column_id}/release/": {
      "post": {
        "description": "Release a column that a Link to another table column fills with one value it brings back: the link stops bringing that value back, and the column becomes a plain column holding the values it has now, out of the link's group, for people to edit. The way to keep a value whose column the other table deleted. The column keeps its id, so views and columns reading it keep working. Refused for any other column.",
        "operationId": "keep_link_values",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Keep a linked value's column as a plain column",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/columns/{column_id}/ui-prefs/": {
      "patch": {
        "description": "Partially update how one column is displayed: hidden, pinned, width, colour tint (omitted fields are left untouched). Hidden, pinned and width are the CALLING USER's own: they change this person's Default view and nobody else's, over the team's layout. The colour tint is shared by everyone in the organisation. A caller with no person behind it (an API key) sets the team's layout. Cosmetic only: this never touches the column definition, never bumps the columns change watermark, and never requests a recompute run. A request that sets nothing is a no-op and leaves the preferences watermark unmoved. Answers with the column's preferences as the caller now sees them.",
        "operationId": "update_table_column_ui_prefs",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableColumnUIPrefsUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableColumnUIPrefsSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a column's display preferences",
        "tags": [
          "table-ui-prefs"
        ]
      }
    },
    "/tables/{table_id}/description/suggestions/": {
      "get": {
        "description": "Write a short description of what a table holds, from its name and its column names and types.\n\nA SUGGESTION, not a write: the response is put in front of the user to accept, edit or discard, and the table is only changed if they then save it. Cell values are never sent: the columns say what the table is about, and the rows are the customer data we have no reason to hand to a model to answer this question. It asks a model, so a key that can only read is refused.",
        "operationId": "describe_table",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableDescriptionSuggestionSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "description": "The model could not suggest a description right now."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Suggest a description for a table",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/{table_id}/duplicate/": {
      "post": {
        "description": "Copy a table's structure (columns, types, formulas remapped onto the new columns, descriptions, each column's run settings and group, the saved views, the team's display preferences and the caller's own column layout) and optionally its rows and cell values. Nothing recomputes: the copy already holds the source's results, errors and staleness included. Sequence columns, and every column reading one, are left out (`left_out_column_names`), as a copy into another workspace leaves them. The copy sits in the same folder as the source and belongs to whoever made it.",
        "operationId": "duplicate_table",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableDuplicateRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableDuplicatedSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Plan table limit reached. Upgrade to create more tables."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Duplicate a table",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/{table_id}/enrichment-audit-logs/": {
      "get": {
        "description": "List the durable audit trail of the table's enrichment actions (configured, edited, run at a scope, cancelled, and the settled per-column cost), newest first. Optionally scoped to one column. Kept indefinitely: the retention policy that strips verbose run records never touches this trail.\n\nA change the AI Assistant made through a granted workspace action lands as `assistant_applied`, naming the proposal it came from, so the change and the card that asked for it read together.",
        "operationId": "list_enrichment_audit_logs",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Restrict to one column's entries.",
            "in": "query",
            "name": "column_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Restrict to one column's entries.",
              "title": "Column Id"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAt",
              "default": "created_at",
              "enum": [
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_EnrichmentAuditLogReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a table's enrichment audit trail",
        "tags": [
          "table-enrichment-audit-logs"
        ]
      }
    },
    "/tables/{table_id}/events/": {
      "get": {
        "description": "Server-sent event stream of a table's changes: row cell deltas, run progress, and column / display-preference / row-set invalidation signals. Replaces the 2-second status poll, so an idle table costs nothing.\n\nDeltas carry the row's `version`, the same watermark the rows list carries, so applying one twice or out of order is a no-op. There is deliberately NO replay log: clients refetch once on every connect, and a mid-stream gap is reported as a `resync` frame meaning the same thing.\n\nThe server closes the stream after a few minutes with a `reconnect` frame; reconnect with a fresh token. Comment heartbeats keep intermediaries from dropping an idle connection.\n\nRequires Clerk authentication; API keys are rejected. There is deliberately no 404: an unknown or foreign table streams heartbeats only, because the channel is org-scoped and leaks nothing.",
        "operationId": "stream_table_events",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/TableChangeEventSchema",
                  "type": "string"
                }
              }
            },
            "description": "A stream of change events; each SSE frame's `data` is one event object."
          },
          "401": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stream a table's change events",
        "tags": [
          "table-events"
        ]
      }
    },
    "/tables/{table_id}/favorite/": {
      "delete": {
        "description": "Remove this table from the CALLING USER's favourites. Favourites are per-user: a teammate's star stays. Unstarring a table that is not starred changes nothing and counts none.",
        "operationId": "delete_table_favorite",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Unstar a table",
        "tags": [
          "table-user-prefs"
        ]
      },
      "put": {
        "description": "Star this table for the CALLING USER. Favourites are per-user, not per-organisation: starring a table does not star it for a teammate. Starring a starred table changes nothing. Unstarring is the delete of the same address.",
        "operationId": "set_table_favorite",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableUserPrefsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Star a table",
        "tags": [
          "table-user-prefs"
        ]
      }
    },
    "/tables/{table_id}/last-view/": {
      "get": {
        "description": "The CALLING USER's own: the query string of the table page's address when they last left it (its view, sort, filter and a view's hidden columns), or null when they left it as it opens for anyone. The dashboard opens a bare table address on it. Never a saved view: nobody else's table changes.",
        "operationId": "get_table_last_view",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableLastViewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Read the view the caller last left this table on",
        "tags": [
          "table-user-prefs"
        ]
      },
      "patch": {
        "description": "Set the CALLING USER's own last view of this table: the query string of the table page's address (view, sort, filter, a view's hidden columns), or null to forget it. Per person, and never written into a saved view, so a running sequence that reads a view is never changed by it.",
        "operationId": "set_table_last_view",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableLastViewUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableLastViewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Remember the view the caller is leaving this table on",
        "tags": [
          "table-user-prefs"
        ]
      }
    },
    "/tables/{table_id}/lead-search/": {
      "delete": {
        "description": "Detach the search from a table, keeping or deleting the rows it produced. Rows are identified by the search's own column, so rows added by other means are never touched. With `dry_run`, answers how many rows would go and removes nothing.",
        "operationId": "detach_table_search",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "delete_rows",
            "required": false,
            "schema": {
              "default": false,
              "title": "Delete Rows",
              "type": "boolean"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DetachedLeadSearchResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This table has no lead search."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Remove a table's search",
        "tags": [
          "find-leads"
        ]
      },
      "get": {
        "description": "The persisted lead search a table was built from, in the request's own shape, so a builder can rehydrate it. A table built another way has none.",
        "operationId": "get_table_search",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadSearchSourceResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table has no lead search"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get the search behind a table",
        "tags": [
          "find-leads"
        ]
      },
      "put": {
        "description": "Give a table its lead search. A table with none gets this one and runs it once: results append beneath the table's existing rows, and `first_run` says what was added. Enrichments are optional here: the destination table is the user's own and may already carry the columns they want. A people search leaves out the people already in the workspace's other tables unless `include_people_already_in_tables` is set, and says how many it skipped. A table that already has a search has its criteria replaced without running them; `enrichments` and `include_people_already_in_tables` are ignored then, `first_run` is null and nothing is charged. A caller that means only one of the two says so in `only`, and the other is refused rather than done.",
        "operationId": "update_table_search",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PutTableLeadSearchRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableLeadSearchResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Not enough credits to enrich the rows this would land."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found, or `only` is `replace` and the table has no search."
          },
          "409": {
            "description": "The table already has a search: `only` is `attach`, or another attach landed first."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderFailureResponseSchema"
                }
              }
            },
            "description": "The lead database refused the query."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Put a lead search behind a table",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/tables/{table_id}/lead-search/impact/": {
      "post": {
        "description": "What running the table's search with `replace` would do, before the search is saved or run: the body is the search as it would be saved (the PUT's body) plus the run's `more_rows` or `max_new_rows`. Says how many rows the run adds, how many it deletes, how many contacts on those rows would stop and in which sequences, and how many of them are mid-conversation. A company search also deletes, from each people table whose search follows this table, the people whose Company link points only at companies it deletes (`linked_tables`). `rows_with_paid_data` and `paid_credits` say how much of what goes was paid for with credits. Planned exactly as the run plans it, so the counts are the run's own while the table and the matches stay as they are. A search that is not people or companies answers `replace_supported: false` and deletes nothing. Free, and changes nothing.",
        "operationId": "preview_replace_table_search",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LeadSearchReplaceImpactRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadSearchReplaceImpactSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This table has no lead search."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderFailureResponseSchema"
                }
              }
            },
            "description": "The lead database refused the query."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview replacing a table's rows with its search",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/tables/{table_id}/lead-search/preview/": {
      "get": {
        "description": "What putting a search behind this table and running it once would set off in the table's OWN columns, before it runs: the columns that run automatically on new rows and read the column the rows land in, priced for `rows` new rows. Add it to the rows' own price and the enrichments the request ticks for the whole price. Also says whether the table already has a search, which a PUT with `only: attach` refuses. Free, and changes nothing.",
        "operationId": "preview_attach_table_search",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Which dataset the search would target.",
            "in": "query",
            "name": "record_type",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/LeadRecordType",
              "description": "Which dataset the search would target."
            }
          },
          {
            "description": "How many rows it would add.",
            "in": "query",
            "name": "rows",
            "required": true,
            "schema": {
              "description": "How many rows it would add.",
              "maximum": 100000,
              "minimum": 0,
              "title": "Rows",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadSearchAttachPreviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview putting a search behind a table",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/tables/{table_id}/lead-search/runs/": {
      "get": {
        "description": "Every recorded execution of the table's search, newest first, including failed ones, with the reason.",
        "operationId": "list_table_search_runs",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForCreatedAtUpdatedAt",
              "default": "created_at",
              "enum": [
                "created_at",
                "updated_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LeadSearchRunLogSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a table's search runs",
        "tags": [
          "find-leads"
        ]
      },
      "post": {
        "description": "Re-run the persisted search into the same table. Existing rows are matched on the provider's identifier and update in place; only genuinely new matches add rows. Answers 201 when every row is in, and 202 when a first batch was added and the rest is still being added in the background: `import_status` says which, and the table's search runs carry the progress. With `more_rows` the run adds that many NEW rows at most: it reads on until that many new rows are in, the matches end, or the table is full, past the search's row limit where it must, and the search keeps the reach the run read, never past its last match. A run that is refused, or fails before it reads, leaves the search as it was. `GET \u2026/runs/preview/` prices it first. A search saved under filters this API no longer accepts answers 422 against `query`: open it, fix the filters, and save it again. With `replace`, once the new rows are in, every row the search no longer matches is deleted (rows added by hand or from a file, rows from another kind of search, and rows the people or company search no longer finds), their contacts stop in every sequence, and `rows_deleted` says how many. There is no undo; `POST \u2026/lead-search/impact/` says what it would delete first. Only people and company searches take `replace`: any other answers 422 against `replace`. Send `max_rows_deleted` with the count the impact said, linked rows included: a run that would now delete more answers 409 and runs nothing.",
        "operationId": "run_table_search",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The most rows this run may add, and so charge for, however many new matches it finds. Leave it out to add every new match within the search's row limit.",
            "in": "query",
            "name": "max_new_rows",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "minimum": 1,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The most rows this run may add, and so charge for, however many new matches it finds. Leave it out to add every new match within the search's row limit.",
              "title": "Max New Rows"
            }
          },
          {
            "description": "Add this many rows the table does not have yet: the run reads on until they are in, the matches end, or the table is full, and adds at most this many. What the table's add bar and People to add on the search page send. Not with `max_new_rows`.",
            "in": "query",
            "name": "more_rows",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maximum": 1000,
                  "minimum": 1,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Add this many rows the table does not have yet: the run reads on until they are in, the matches end, or the table is full, and adds at most this many. What the table's add bar and People to add on the search page send. Not with `max_new_rows`.",
              "title": "More Rows"
            }
          },
          {
            "description": "After adding, delete every row the search no longer matches, so the table holds only what it finds. Their contacts stop in every sequence, and nothing brings the rows back. People and company searches only.",
            "in": "query",
            "name": "replace",
            "required": false,
            "schema": {
              "default": false,
              "description": "After adding, delete every row the search no longer matches, so the table holds only what it finds. Their contacts stop in every sequence, and nothing brings the rows back. People and company searches only.",
              "title": "Replace",
              "type": "boolean"
            }
          },
          {
            "description": "With `replace`, the most rows the run may delete, the people tables following a company search included: the count the confirm showed. A run that would delete more answers 409 and runs nothing.",
            "in": "query",
            "name": "max_rows_deleted",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "With `replace`, the most rows the run may delete, the people tables following a company search included: the count the confirm showed. A run that would delete more answers 409 and runs nothing.",
              "title": "Max Rows Deleted"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadSearchRunResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadSearchRunResponseSchema"
                }
              }
            },
            "description": "A first batch was added and the rest is still being added."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Not enough credits to add the rows this would land."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This table has no lead search."
          },
          "409": {
            "description": "With `max_rows_deleted`, the run would now delete more rows."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderFailureResponseSchema"
                }
              }
            },
            "description": "The lead database refused the query."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Run a table's search again",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/tables/{table_id}/lead-search/runs/preview/": {
      "get": {
        "description": "What running the table's search with `more_rows` would add and cost, before it runs: the most rows it may add, the most it can cost and what it usually costs. The same plan the run goes on from, so the price is the run's own; it refuses what the run refuses before it buys anything (a search saved under filters this API no longer accepts, or a followed table that holds no companies, answers 422 against `query`). Free, and changes nothing.",
        "operationId": "preview_table_search_run",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "How many new rows the run would add, as `more_rows` on the run.",
            "in": "query",
            "name": "more_rows",
            "required": true,
            "schema": {
              "description": "How many new rows the run would add, as `more_rows` on the run.",
              "maximum": 1000,
              "minimum": 1,
              "title": "More Rows",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadSearchRunPreviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This table has no lead search."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview a run of a table's search",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/tables/{table_id}/lead-search/schedule/": {
      "delete": {
        "description": "Return the table's search to manual runs. Clearing a search that was never scheduled is not an error and answers a count of 0. With `dry_run`, answers the same and changes nothing.",
        "operationId": "clear_table_search_schedule",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be cleared, and clear nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be cleared, and clear nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This table has no lead search."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Clear a search's run cadence",
        "tags": [
          "find-leads"
        ]
      },
      "put": {
        "description": "Schedule the table's search to run on a cadence. The response previews the next three firings. Returning the search to manual runs is deleting the schedule. With `dry_run`, makes every check the set makes and answers the same body, scheduling and saving nothing.",
        "operationId": "set_table_search_schedule",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Check the cadence and answer its next firings, and schedule nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Check the cadence and answer its next firings, and schedule nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LeadSearchScheduleRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadSearchScheduleResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "This table has no lead search."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Set a search's run cadence",
        "tags": [
          "find-leads"
        ]
      }
    },
    "/tables/{table_id}/link-readers/": {
      "get": {
        "description": "Every Link to another table column on another table that points into this one, with which of this table's columns it matches on and which values it brings back. What deleting one of this table's columns, or moving the table to Trash, stops updating there. A link on a table in Trash is left out. By the linking table's name, then the link's, a page at a time.",
        "operationId": "list_link_readers",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForTableName",
              "default": "table_name",
              "enum": [
                "table_name"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_LinkReaderReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the links of other tables into this one",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/open/": {
      "post": {
        "description": "Note that the CALLING USER just opened this table, which is what feeds their recently-opened list. Best-effort: clients fire it on open and ignore the result. Never touches the starred flag: opening a table says nothing about whether the user wants it starred.",
        "operationId": "record_table_view",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableUserPrefsReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Record that the caller opened this table",
        "tags": [
          "table-user-prefs"
        ]
      }
    },
    "/tables/{table_id}/reference-fields/": {
      "get": {
        "description": "Every column of the other table, in its order, as a column linked from this table may bring it back: the type it would carry (its own), and whether a pair may match on it. Every column can be brought back but one whose value reads the link being edited, which would loop back into this table; that one says why. Answered whole in one page: there is at most one entry per column of the other table.",
        "operationId": "list_reference_fields",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The table the link would point into.",
            "in": "query",
            "name": "target_table_id",
            "required": true,
            "schema": {
              "description": "The table the link would point into.",
              "format": "uuid",
              "title": "Target Table Id",
              "type": "string"
            }
          },
          {
            "description": "The link column being edited; omit for a new one, which nothing reads.",
            "in": "query",
            "name": "column_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The link column being edited; omit for a new one, which nothing reads.",
              "title": "Column Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_ReferenceFieldChoiceReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List what a link to another table can bring back",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/references/preview/": {
      "post": {
        "description": "Read this table's first 500 rows against the other table with the pairs given, and say how many would point at a row there, how many hold a value it does not have, how many have nothing to match on, and up to five values that matched nothing. When nothing can match as set up (the other table is gone or too big, or no pair is left), `error` says why. Saves nothing and costs nothing.",
        "operationId": "preview_reference_match",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReferenceMatchPreviewRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReferenceMatchPreviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview how a link to another table would match",
        "tags": [
          "table-columns"
        ]
      }
    },
    "/tables/{table_id}/restore/": {
      "post": {
        "description": "Bring a trashed table back, with every column, row and cell it held, into the folder it was in (the top level when that folder is in Trash too).\n\nFails if a live table has taken its name in the meantime. One of the two has to be renamed first, and this endpoint will not guess which.",
        "operationId": "restore_table",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Report the restored table, and restore nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report the restored table, and restore nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found in trash"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Restore a trashed table",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/{table_id}/rows/": {
      "post": {
        "description": "Append up to 1000 empty rows to the table (one by default) and request a SINGLE row-added recompute run scoped to all of them. The row cap is enforced atomically over the whole batch, so the append is all-or-nothing. Passing after_record_id or before_record_id instead inserts exactly one row directly below or above that row, touching no other row's position. The run appears on the next active-runs poll; the response never carries a run ID, and a table with no formula columns discards the request at plan time.",
        "operationId": "create_table_rows",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRowsCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableRowsCreatedResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or anchor row not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create table rows",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/bulk/": {
      "patch": {
        "description": "Apply up to 1000 manual cell edits in ONE transaction, then recompute their downstream formula cells: inline when the scope is small (see `recomputed_column_ids`), otherwise via a SINGLE cell-edited run covering all of them. The endpoint that makes a grid paste one request instead of N. A null value clears that cell. All-or-nothing: every column and value is validated before anything is written, so a formula column or a type mismatch anywhere rejects the whole batch and writes nothing. Same-value edits are counted in skipped and write nothing. Read-your-writes: the response carries every named row's post-write state and version.\n\nA Select or Multi-select cell takes only the column's own options (its `type_options.choices`): each value is matched to one ignoring case and spacing and stored as the option is spelled, and one that names no option refuses the whole batch with a 422 `cell_value_not_a_choice` naming the cell and the options. `restore` is for the grid's undo and redo history ONLY: it writes back a value the options no longer name exactly as the cell held it. Never set it to get a new value past the options; add the value to the column's options instead. A dry run checks every edit and answers the counts, stale columns and rows as the write would leave them (before any recompute), writing nothing.",
        "operationId": "bulk_set_table_cells",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableCellsBulkEditRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableCellsBulkMutationResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Row or column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Set many table cell values",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/bulk/add-to-sequence/": {
      "post": {
        "description": "Adds a table's rows to a sequence. Takes the rows by `record_ids` (at most 1000), or with `all=true` every row the listing matches, narrowed by `where` and `row_status` (at most 1000 may match). Rows already enrolled, without an email, or over the per-company cap are skipped, and `updated` counts the rest. The sequence must target this table as its audience, or be a draft with no audience yet: that draft takes the added rows as its audience (a saved view of them), and a dry run judges them as it would. `where` takes the rows query's vocabulary and is refused as the rows query refuses it.",
        "operationId": "add_rows_to_sequence",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer what the action would do, exactly as the real call answers it, and change nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrolRowsRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrolRowsResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "The sequence is missing or its audience is another table, or a filter names a column this table does not have."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "More rows match than one request adds, a filter does not apply to its column, or a draft with no audience is given a table that lists companies, not people."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Add grid rows to a sequence",
        "tags": [
          "sequences"
        ]
      }
    },
    "/tables/{table_id}/rows/bulk/delete/": {
      "post": {
        "description": "Delete up to 1000 rows by record ID, or (with `all: true`) every row the listing matches, optionally narrowed by `where`/`row_status` (the rows query's own predicate vocabulary) and leaving out `except_record_ids`. With `duplicates: true` under a `where` that keeps one row per value, it deletes the duplicates that where hides and keeps the selected rows. Record IDs that do not exist are simply absent from the result; a predicate delete reports only the count. Row deletion has no recompute effect, so no run is requested.",
        "operationId": "bulk_delete_table_rows",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRowsDeleteSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableRowsDeletedResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found, or a filter names a column it does not have"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Bulk delete table rows",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/export/": {
      "post": {
        "description": "Download a table's rows as a file. Two scopes: send `sorts`/`where`/`column_ids` to export what the grid is currently showing (leaving out `except_record_ids`), or `record_ids` to export a specific row selection. The two are mutually exclusive.\n\n`format` picks the file, and it changes how values are written. A CSV holds everything as text: timestamps in ISO 8601, lists and objects as JSON, so the file round-trips back through an import. Free-text cells are neutralised against spreadsheet formula injection; numbers are not, so they stay summable.\n\nAn .xlsx keeps native types instead, so a number stays summable, a date sorts as a date and a checkbox is a real boolean. Nothing needs neutralising there, because a string cell is never evaluated as a formula.\n\nA CSV streams synchronously in keyset pages, so a large export starts downloading immediately. A workbook is a zip and cannot be streamed, so it is built in full before the response begins.",
        "operationId": "export_table_rows",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableExportRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {},
              "text/csv": {}
            },
            "description": "The table as a CSV or Excel file."
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Export table rows as a CSV or Excel file",
        "tags": [
          "table-export"
        ]
      }
    },
    "/tables/{table_id}/rows/ids/": {
      "post": {
        "description": "Get the record IDs a listing selects, in order, carrying NO cell data: a page whose `data` are the IDs, with `next_page_cursor` to the rest.\n\nTakes the same `sorts`, `where`, `row_status`, `cursor` and `offset` vocabulary as the rows query and answers only the membership-and-order half of it. Pages are correspondingly large (the default is 10,000 IDs) because a page of IDs is a fraction of the size of a page of rows. The two answer the same cursor for the same place in a listing, so either resumes where the other stopped; a cursor any other list answered is refused with `invalid_cursor`.\n\nPair it with the rows query's `record_ids` mode: fetch an ordering once, then hydrate contents a window at a time. A client holding both can re-sort or re-filter by refetching only the ordering, and reuse every cell it already has.\n\nA POST for the same reason the rows query is one: a filter list has no honest query-string encoding.",
        "operationId": "query_table_row_ids",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRowIdsQueryRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_UUID_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Query a listing's row IDs",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/length/": {
      "post": {
        "description": "How many rows a predicate matches, with no rows read.\n\nTakes the `where` and `row_status` vocabulary of the rows query, so a saved view's own filter can be counted by sending it back verbatim: that is how a picker can say what choosing a view will actually select before anything is bound to it.\n\nAn unfiltered count is free: it reads the table's maintained counter rather than scanning. A filtered one is an exact COUNT over the same predicate the listing applies, never an estimate, so the number cannot disagree with the rows the client goes on to fetch.\n\nA POST for the same reason the rows query is one: a filter list has no honest query-string encoding.",
        "operationId": "count_table_rows",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRowsCountRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableRowsCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found, or a filter names a column it does not have"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count the rows a filter selects",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/query/": {
      "post": {
        "description": "List a table's rows with keyset pagination on an opaque cursor. Without a sort, rows come in DISPLAY order: the user-controlled row position, with the time-ordered record ID as a tiebreak. With one, they come in that column's value order, and rows with no value for it sort LAST in both directions. Filters are predicates on cell values and compose with either order.\n\n`column_ids` projects each row's cells: send the columns the grid will render and the response carries only those. A column outside the projection reads as 'not fetched' rather than 'blank'.\n\nA POST because a filter list has no honest query-string encoding. Each cell's computing flag is derived: stale AND an active run covers that row.\n\nPerformance note: an unfiltered sort streams the column's index. Add a filter and Postgres sorts the matched set instead, so a filter that matches most of a very large table is correspondingly slower.",
        "operationId": "query_table_rows",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRowsQueryRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableRowSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Query table rows",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/search/": {
      "post": {
        "description": "Find cells whose text contains the query, anywhere in the table, and report where each one sits in the listing the client is currently showing, so the grid can scroll to a match rather than only highlight the page it is on. Matches come a page at a time, by row offset then column. TEXT columns only: a number or a date would have to be rendered to be matched as text, and how it renders is a client-side question, so a server-side answer could disagree with the cell on screen. Send the grid's current `sorts` and `where`; an offset counted against a different listing points at the wrong row. How many cells match in all is `POST /tables/{table_id}/rows/search/length/`.",
        "operationId": "search_table_rows",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRowSearchRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableRowSearchMatchSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "A sort or filter names a column this table does not have"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Search a table's cells",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/search/length/": {
      "post": {
        "description": "How many cells contain the query: the same text columns, filters and match as `POST /tables/{table_id}/rows/search/`, counted rather than listed. What a grid shows as the total beside the match it is on.",
        "operationId": "count_table_row_search_matches",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRowSearchCountRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableRowSearchCountSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count a search's matches",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/{record_id}/": {
      "patch": {
        "description": "Set or clear one manual cell of the row (read-your-writes: the response carries the post-write row state and version). A null `value` clears the cell so the column's default renders again. When the edit marks formula dependents stale, a small scope is recomputed INLINE inside this request: those columns are listed in `recomputed_column_ids` and their final values are already in `cells`, with no run requested. A larger scope instead requests a cell-edited recompute run that appears on the next active-runs poll; the response never carries a run ID. A same-value edit (or clearing a blank cell) writes nothing, recomputes nothing, and requests no run.\n\nA Select or Multi-select cell takes only the column's own options (its `type_options.choices`): a value is matched to one ignoring case and spacing and stored as the option is spelled, and anything else is refused with a 422 `cell_value_not_a_choice` that lists the options.",
        "operationId": "set_table_cell",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableCellEditRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableCellMutationResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Row or column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Set a table cell value",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/{record_id}/cells/{column_id}/feedback/": {
      "delete": {
        "description": "Remove the signed-in user's verdict on one cell. Pressing the same thumb twice means taking it back, which has to differ from never having said anything. A cell with no verdict of theirs answers `count` 0, \"No feedback to withdraw\": nothing changed.",
        "operationId": "clear_cell_feedback",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Withdraw your feedback on a cell",
        "tags": [
          "table-rows"
        ]
      },
      "get": {
        "description": "The signed-in user's own verdict on one cell, or null if they have not given one. Feedback is per person: two people are meant to be able to disagree about the same value.",
        "operationId": "get_cell_feedback",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CellFeedbackResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get your feedback on a cell",
        "tags": [
          "table-rows"
        ]
      },
      "put": {
        "description": "Record the signed-in user's thumbs up on one value an agent wrote, with an optional note. Re-rating the same cell replaces the earlier verdict rather than adding a second one. Only cells an agent wrote can be rated (a Use AI or built-in agent column, linked to a saved agent or not, and its fan-out fields), because feedback exists to improve an agent. A thumbs down is refused here: mark the cells Needs work with a reason through `POST /agent-learnings/thumbs-downs/`, which teaches the agent and runs them again.",
        "operationId": "rate_cell",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CellFeedbackRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CellFeedbackSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Rate a cell's value",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/rows/{record_id}/cells/{column_id}/run-detail/": {
      "get": {
        "description": "The cell's most recent enrichment execution: the resolved prompt, action and model, outcome, duration, and the agent's investigation (reasoning, confidence, steps, sources) when there was one. Raw provider responses are never stored, so nothing internal can leak.",
        "operationId": "get_cell_run_detail",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "record_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Record Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "column_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Column Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrichmentCellRunSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Cell has no run record"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a cell's enrichment run detail",
        "tags": [
          "table-rows"
        ]
      }
    },
    "/tables/{table_id}/runs/": {
      "get": {
        "description": "List a table's recompute runs with optional status and trigger filtering.",
        "operationId": "list_table_runs",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/TableRunStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by run status."
            },
            "description": "Filter by run status."
          },
          {
            "in": "query",
            "name": "trigger",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/TableRunTrigger"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by run trigger."
            },
            "description": "Filter by run trigger."
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAtUpdatedAt",
              "default": "id",
              "enum": [
                "id",
                "created_at",
                "updated_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableRunReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List table runs",
        "tags": [
          "table-runs"
        ]
      },
      "post": {
        "description": "Start a run, priced first by the preview with the same body. `kind` says what it covers: `column` runs one computed column over a scope (all, errored, unfilled, first N, or chosen cells); `columns` runs several columns over chosen rows as one run in dependency order, which is what a swept selection becomes; `rows` runs chosen rows, or every row the view matches, across every computed column; `failed_cells` runs only the cells that failed, column by column. The run is refused before any work starts when the balance cannot cover its price. A run row is created after the request commits, so `runs` is often empty at first; the active runs feed picks each run up.",
        "operationId": "create_table_run",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRunCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableRunsCreatedSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Start a table run",
        "tags": [
          "table-runs"
        ]
      }
    },
    "/tables/{table_id}/runs/bulk/cancel/": {
      "post": {
        "description": "The global Stop Run action: withdraw every run asked for that has not started yet, then flip every active run of the table to cancelling in one update. Running pages observe the flip within about a second and each workflow finalizes its run as cancelled. Answers already in the table stay; a cell still computing is dropped uncharged; remaining cells are skipped. A run an earlier Stop already reached is not flipped or counted again. Idempotent: zero runs and empty lists when nothing was left to stop.",
        "operationId": "stop_table_runs",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableStoppedRunsResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stop all table runs",
        "tags": [
          "table-runs"
        ]
      }
    },
    "/tables/{table_id}/runs/preview/": {
      "post": {
        "description": "What a run would cover and cost, without running it. Takes the same body as starting the run, so the price quoted is the price of the run asked for. Free runs cost nothing and are always covered. A view too wide to run answers `scope_too_large` with its row count rather than an error. A `failed_cells` run is priced column by column: preview each column with kind `column` and scope `errored`.",
        "operationId": "preview_table_run",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableRunCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableRunPreviewSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or column not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Preview a table run",
        "tags": [
          "table-runs"
        ]
      }
    },
    "/tables/{table_id}/runs/{run_id}/cancel/": {
      "post": {
        "description": "Request cancellation of one active run: the run flips to cancelling, its running pages observe the flip within about a second (answers already in the table stay; a cell still computing is dropped uncharged), and the workflow finalizes the run as cancelled. Edge case: a cancel accepted after the final page has already computed finalizes the run as completed (or completed_with_errors) instead of cancelled.",
        "operationId": "cancel_table_run",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          },
          {
            "description": "Answer exactly as the real call would, changing nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Answer exactly as the real call would, changing nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableRunReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table run not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Cancel a table run",
        "tags": [
          "table-runs"
        ]
      }
    },
    "/tables/{table_id}/schedule/": {
      "delete": {
        "description": "The source stays attached; only the recurring run stops. A table with no schedule answers `count` 0, \"Table had no schedule\": nothing changed.",
        "operationId": "delete_table_schedule",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Stop a table refreshing on a cadence",
        "tags": [
          "table-schedules"
        ]
      },
      "get": {
        "description": "Read how often a table re-imports.",
        "operationId": "get_table_schedule",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableScheduleSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table has no schedule"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a table's refresh cadence",
        "tags": [
          "table-schedules"
        ]
      },
      "patch": {
        "description": "Editing the cadence re-anchors it: 'every 3 days' set today means three days from today. Resuming a paused schedule on its own does NOT: it keeps firing at the same time of day (or the same interval) the schedule was already on, just moved to the next upcoming occurrence, so a schedule left paused for a month neither fires the moment it comes back nor drifts to a new time.",
        "operationId": "update_table_schedule",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTableScheduleRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableScheduleSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table has no schedule"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Change a table's refresh cadence",
        "tags": [
          "table-schedules"
        ]
      },
      "put": {
        "description": "Re-import on a cadence: from the connected tool that fills the table, or, for a table made from a subdomain search, by reading its domain again and adding the new subdomains. A table has one schedule: this makes it, or replaces the one it has with the cadence sent, and a paused schedule stays paused. The presets are calendar statements (monthly on the same date, quarterly in the same month) while `custom` is an interval counted from when you set it up.\n\nThe response carries the next few fire times, so a cadence can be checked before it is left to run unattended.\n\nTurning on `delete_missing_rows` makes every scheduled run re-list the whole source: a changes-only fetch cannot tell a deleted record from an unchanged one, and treating the difference as deletion would empty the table. A table made from a subdomain search only ever adds rows, so it refuses `delete_missing_rows`.",
        "operationId": "set_table_schedule",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTableScheduleRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableScheduleSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Set a table's refresh cadence",
        "tags": [
          "table-schedules"
        ]
      }
    },
    "/tables/{table_id}/source/": {
      "delete": {
        "description": "Stops the table refreshing. Rows, columns and values are all left exactly as they are; the imported-record column simply stops being updated. Deleting it would take every column extracted from it too, which is a much bigger thing than detaching a source.",
        "operationId": "delete_table_import_integration",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be detached, and detach nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be detached, and detach nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Detach a table's import source",
        "tags": [
          "table-sources"
        ]
      },
      "get": {
        "description": "The connected tool a table's rows are imported from. A table no tool fills (typed by hand, loaded from a file, or built by a lead search) has none.",
        "operationId": "get_table_import_integration",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableSourceSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found, or it has no import source"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a table's import source",
        "tags": [
          "table-sources"
        ]
      },
      "patch": {
        "description": "Change the row limit, the field rows are matched on, or both. The integration and the record type define what the table's existing rows ARE. Changing either would import a different population over them rather than refresh them, so a different source means a different table. A field left out keeps its value.\n\nMatch rows on a different id field from now on, for example the tool's own record id instead of an email address, with `identity_field`. Every imported row is re-keyed from the record it already stores, all at once: no row is deleted, merged or added, and every column and value stays. Refused while an import is running, when some records or rows have no value for the field, when two share one, or when the rows store it in a form a refresh cannot match; the identity options route says which applies beforehand. A field people can edit in the tool brings an edited record back as a new row on the next refresh.",
        "operationId": "update_table_import_integration",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTableSourceRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableSourceSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table has no source"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a table's import source",
        "tags": [
          "table-sources"
        ]
      }
    },
    "/tables/{table_id}/source/identity-options/": {
      "get": {
        "description": "For a table fed by a connected tool: every id field its records carry, which one the rows are matched on now, and what switching to each would do. Reads one fresh sample from the tool (whether every record carries the field and no two share it) and the table's own rows (how many have no value for it and how many share one). `available` says whether the switch can be made; `problem` says why not. Changes nothing.",
        "operationId": "list_table_import_integration_identity_options",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_SourceIdentityOptionSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table has no source"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the fields a table's imported rows could be matched on",
        "tags": [
          "table-sources"
        ]
      }
    },
    "/tables/{table_id}/source/promote/": {
      "post": {
        "description": "Creates a formula column that reads the path out of the imported-record column, and backfills it.\n\nA formula rather than a copy, deliberately: it tracks the record through every refresh, where copied values would go stale the first time the record changed.\n\nWith `dry_run` the same checks run, a full table or a name already taken is refused the same way, and no column is made.",
        "operationId": "promote_source_field",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Check the promotion and answer as it would, making no column.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Check the promotion and answer as it would, making no column.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoteSourceFieldRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromoteSourceFieldResponseSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table has no source"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Give one field of the imported record its own column",
        "tags": [
          "table-sources"
        ]
      }
    },
    "/tables/{table_id}/source/runs/": {
      "get": {
        "description": "A connected-tool table's import runs, newest first: what each added, updated and removed, how many records it skipped and why, whether it stopped at the row limit, and why a failed one failed. `status` narrows to one outcome, e.g. `succeeded` for the refresh the table last shows.",
        "operationId": "list_table_import_integration_runs",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "Only runs with this outcome.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/TableSourceRunStatus"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Only runs with this outcome.",
              "title": "Status"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdStartedAt",
              "default": "started_at",
              "enum": [
                "id",
                "started_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableSourceRunSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table has no source"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List a table's recent imports",
        "tags": [
          "table-sources"
        ]
      },
      "post": {
        "description": "Start an import immediately. Where the provider supports it and the table has synced before, only records changed since the last successful run are fetched; otherwise everything is re-listed.\n\n`full_relist` re-fetches every record without deleting anything. `delete_missing_rows` additionally removes rows whose records the source no longer returns: a separate, destructive ask, refused while the source has a row limit.\n\nRefused while an import is already running: two concurrent imports would race the same rows.",
        "operationId": "run_table_import_integration",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/RunTableSourceRequestSchema"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableSourceRunSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table has no source"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Refresh a table from its source now",
        "tags": [
          "table-sources"
        ]
      }
    },
    "/tables/{table_id}/source/runs/{run_id}/": {
      "get": {
        "description": "Poll an import's progress. `rows_created` and `rows_updated` climb while it runs; `status` reaches `succeeded` or `failed` and stays there.\n\n`rows_skipped` counts records the run read and left out, split by why: `rows_skipped_no_identity` came back with no value for the field rows are matched on, `rows_skipped_duplicate` shared their match value with an earlier record in the same page. The skipped-records route names them. `stopped_at_row_limit` says the run stopped at the source's row limit with records still unread in the tool, which is not a skip.",
        "operationId": "get_table_import_integration_run",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableSourceRunSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Run not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get an import run's status",
        "tags": [
          "table-sources"
        ]
      }
    },
    "/tables/{table_id}/source/runs/{run_id}/skips/": {
      "get": {
        "description": "Which records a connected-tool import read and left out of the table, and why: no value for the field rows are matched on, or a match value an earlier record in the same page already had. Each names the record the way to find it in the tool (its name or email, else another of its ids). Records past the row limit are not here: the run never read them, and says so in `stopped_at_row_limit`.",
        "operationId": "list_table_import_integration_run_skips",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForIdCreatedAt",
              "default": "id",
              "enum": [
                "id",
                "created_at"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableSourceRunSkipSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Run not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List the records an import run skipped",
        "tags": [
          "table-sources"
        ]
      }
    },
    "/tables/{table_id}/stats/": {
      "get": {
        "description": "Get aggregate stats for one table: row count, columns per kind, failed cell count, the newest active run (if any), whether the table is at its row cap, and when anyone last added a row or wrote a value in it.",
        "operationId": "get_table_stats",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableStatsSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get table stats",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/{table_id}/status/": {
      "get": {
        "description": "A table's active runs plus change watermarks for rows, columns, display preferences, and the definition, in one response.\n\nNOT A POLLING TARGET. The grid now receives changes over the change feed (`GET /tables/{table_id}/events/`) and fetches this once on load for its initial active-run state. It remains useful to any client that wants a cheap point-in-time snapshot without opening a stream.\n\nPreferences are watermarked separately from columns so a hide, pin, resize, or recolour refreshes the column list alone. A client comparing two responses must compare for inequality, never ordering: max timestamps can move backward when the newest row or column is hard-deleted (the counts catch deletes). All timestamps are server-generated; never compare them to the client clock. There is deliberately no table-existence 404: an unknown or foreign table returns empty runs and null/zero watermarks, which leaks nothing (same no-leak contract as the active-runs endpoint). The org-scoped definition read gates the row aggregate, so a foreign table ID never reaches the (potentially large) row index.",
        "operationId": "get_table_status",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableStatusSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get table change status",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/{table_id}/subdomain-feed/": {
      "get": {
        "description": "A table made from a subdomain search reads its domain again to add the subdomains it did not have: when somebody refreshes it, and on the table's refresh schedule (`/tables/{table_id}/schedule/`). This says which domain, when it was last read, what the newest read added, and whether one is under way. Only a table whose read says `has_subdomain_feed` has one; every other table answers 404.",
        "operationId": "get_subdomain_feed",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubdomainFeedSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No subdomain search made this table."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Get a table's subdomain feed",
        "tags": [
          "find-subdomains"
        ]
      }
    },
    "/tables/{table_id}/subdomain-feed/sync/": {
      "post": {
        "description": "Read the table's domain again and add, as new rows, the subdomains the table never had. Rows somebody deleted stay deleted. Returns at once with the feed checking; read the feed until `checking` is false. Reading costs nothing; the table's enrichment columns run over the rows it adds, as they do for any new row.",
        "operationId": "refresh_subdomain_feed",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubdomainFeedSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "402": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequiredResponse"
                }
              }
            },
            "description": "Not enough credits, or the plan does not include subdomain search."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "No subdomain search made this table, or the table is in Trash."
          },
          "409": {
            "description": "A check for this table is already under way."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Check a subdomain table for new subdomains now",
        "tags": [
          "find-subdomains"
        ]
      }
    },
    "/tables/{table_id}/template/": {
      "get": {
        "description": "PUBLIC, no sign-in. Serves a table's SHAPE (its columns, their configuration, and what each column holds in words) when, and only when, its owner has turned on `shared_as_template`. A table that has not opted in answers 404 exactly as a non-existent one does, so an id alone reveals nothing. Never serves a row or a cell value.",
        "operationId": "get_shared_table_template",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedTableTemplateSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "summary": "Read a table published as a template",
        "tags": [
          "tables"
        ]
      }
    },
    "/tables/{table_id}/views/": {
      "get": {
        "description": "List the saved views of a table in position-then-name order, paged by cursor: the view switcher reads every page.",
        "operationId": "list_table_views",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "description": "The number of items to return.",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "description": "The number of items to return.",
              "maximum": 100,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "order_by",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderingParametersForPosition",
              "default": "position",
              "enum": [
                "position"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "order_direction",
            "required": false,
            "schema": {
              "default": "asc",
              "enum": [
                "asc",
                "desc"
              ],
              "title": "Order Direction",
              "type": "string"
            }
          },
          {
            "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Set the cursor to the next or previous page. You can get the cursor from the previous page's response.",
              "title": "Cursor for pagination."
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponse_TableViewReadSchema_"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "List table views",
        "tags": [
          "table-views"
        ]
      },
      "post": {
        "description": "Create a saved view: a named, org-shared sort/filter/hidden-column bundle the client applies on top of the live table. Views never touch the table's display preferences, and creating one recomputes nothing.\n\n`is_default` claims the table's default slot: the view a link naming none opens on, for a person with no last view of the table. At most one view per table holds it, so claiming it stands down the previous holder in the same transaction.",
        "operationId": "create_table_view",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableViewCreateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableViewReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Create a table view",
        "tags": [
          "table-views"
        ]
      }
    },
    "/tables/{table_id}/views/{view_id}/": {
      "delete": {
        "description": "Delete a saved view. The table, its columns, and its rows are untouched; a view is only a stored way of looking at them. Refused while a draft, running or paused sequence reads its contacts through the view, naming them: change their audience first.",
        "operationId": "delete_table_view",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "view_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "View Id",
              "type": "string"
            }
          },
          {
            "description": "Report what would be deleted, and delete nothing.",
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "description": "Report what would be deleted, and delete nothing.",
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessfullyDeletedResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or view not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Delete a table view",
        "tags": [
          "table-views"
        ]
      },
      "patch": {
        "description": "Partially update a saved view's name, description, position, default flag, or configuration (omitted fields are left untouched; an all-omitted body writes nothing).\n\n`is_default: true` moves the table's default slot to this view, standing down whichever held it; `false` clears it, leaving the table with no default.",
        "operationId": "update_table_view",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "view_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "View Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableViewUpdateSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableViewReadSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table or view not found"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Update a table view",
        "tags": [
          "table-views"
        ]
      }
    },
    "/tables/{table_id}/views/{view_id}/impact/": {
      "post": {
        "description": "Before a view's filter is saved, says for each draft, running or paused sequence that reads its contacts through the view how many contacts the new filter adds, removes (they stop, reading Left the audience) and leaves unchanged. Saving the filter applies it to those sequences at once. A sequence that does not keep in sync with its table ignores the edit and carries no counts. Writes nothing.\n\nA POST for the same reason the rows query is one: a filter list has no honest query-string encoding.",
        "operationId": "preview_table_view_sequence_impact",
        "parameters": [
          {
            "in": "path",
            "name": "table_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Table Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "view_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "View Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TableViewSequenceImpactRequestSchema"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableViewSequenceImpactListSchema"
                }
              }
            },
            "description": "Successful Response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedResponse"
                }
              }
            },
            "description": "Unauthorized"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenResponse"
                }
              }
            },
            "description": "Forbidden"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundResponse"
                }
              }
            },
            "description": "Table not found, or the filter names a column it does not have"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableEntityResponse"
                }
              }
            },
            "description": "Invalid request made to the API."
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Internal server error."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Bad gateway error."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerErrorResponse"
                }
              }
            },
            "description": "Service unavailable."
          }
        },
        "security": [
          {
            "APIKeyHeader": []
          },
          {
            "HTTPBearer": []
          }
        ],
        "summary": "Count what a new filter does to the sequences that follow a view",
        "tags": [
          "table-views"
        ]
      }
    }
  },
  "tags": [
    {
      "description": "The docked AI Assistant: its general chat about the workspace and the product, streamed as Server-Sent Events, and the one list of a person's threads across every assistant, with pin, rename, delete and the search-to-table link.",
      "name": "assistant"
    },
    {
      "description": "The messages a person keeps to send the assistant again: the ones the workspace saved and the ones that ship with the product, with save, rename, edit and delete.",
      "name": "assistant-prompt"
    },
    {
      "description": "Granted workspace actions: what the AI Assistant proposed or applied in a conversation, the approve and dismiss decisions on each card, the workspace's spend threshold and default grants, and the eight verbs.",
      "name": "workspace-actions"
    },
    {
      "description": "The Getting started checklist: a workspace's progress through the six steps from its first people search to its first launched sequence.",
      "name": "onboarding"
    },
    {
      "description": "Senders, connected mailboxes, tags, and the Google connect flow.",
      "name": "senders"
    },
    {
      "description": "The workspace do-not-contact list, enforced before every send.",
      "name": "suppression"
    },
    {
      "description": "The workspace's recontact rule: how long before anyone hears from us again.",
      "name": "contact_cooldown"
    },
    {
      "description": "Sequence authoring: the graph, the table-backed audience, previews.",
      "name": "sequences"
    },
    {
      "description": "The outbound agent behind a sequence: the voice it writes in, its per-message prompts, what it wrote and what people told it.",
      "name": "outbound-agents"
    },
    {
      "description": "The LinkedIn channel: connecting an account to a sender, its safety limits and history, and the protocol the browser extension speaks.",
      "name": "linkedin"
    },
    {
      "description": "The approval queue: everything waiting on a person across every sender and channel, and the workspace's manual or automatic modes per channel.",
      "name": "outreach"
    },
    {
      "description": "The unified outreach inbox: threads, replies, labels, events.",
      "name": "inbox"
    },
    {
      "description": "The AI reply layer: workspace settings, drafts, and approval.",
      "name": "inbox-ai"
    },
    {
      "description": "Notification rules, per-user preferences, and the Slack connection.",
      "name": "notifications"
    },
    {
      "description": "Endpoints for seeing all available integration types.",
      "name": "integration-types"
    },
    {
      "description": "Endpoints for listing, checking and deleting integrations.",
      "name": "integrations"
    },
    {
      "description": "Create, preview and update an integration of any type: the body's integration_type picks the config and credentials it takes.",
      "name": "integration-specific"
    },
    {
      "description": "Endpoints for the generic OAuth install/claim app-listings engine.",
      "name": "app-listings"
    },
    {
      "description": "Endpoints for creating and managing API keys.",
      "name": "apikey"
    },
    {
      "description": "AI apps connected to the workspace: Claude, ChatGPT, Claude Code or any other MCP client a person signed in to Oneprofile's MCP server with.",
      "name": "ai_apps"
    },
    {
      "description": "Endpoints for managing billing and subscription information.",
      "name": "billing"
    },
    {
      "description": "Accounts: every company the workspace's tables name, with the people at it, its key facts, its tables, its org chart and what went to its people; the tables that feed it (Sources) and the merges a person made.",
      "name": "accounts"
    },
    {
      "description": "Endpoints for creating and managing tables.",
      "name": "tables"
    },
    {
      "description": "Endpoints for table columns, formula previews, and on-demand column runs.",
      "name": "table-columns"
    },
    {
      "description": "Endpoints for table rows and manual cell edits.",
      "name": "table-rows"
    },
    {
      "description": "Endpoints for observing and cancelling table recompute runs.",
      "name": "table-runs"
    },
    {
      "description": "Endpoints for org-shared per-column display preferences: hidden, pinned, width, and colour tint.",
      "name": "table-ui-prefs"
    },
    {
      "description": "Endpoints for the org-shared names given to the column tint palette: what this organisation calls each colour. Org-level, not per-table.",
      "name": "table-column-color-labels"
    },
    {
      "description": "Endpoints for the enrichment action catalog, model list, presets, draft generation, and saved agents.",
      "name": "table-enrichments"
    },
    {
      "description": "Endpoints for an agent's Preview: example rows run one at a time, and a Looks good on each. Needs work lives under agent-learnings.",
      "name": "agent-training"
    },
    {
      "description": "An agent's learnings, the one-line rules it follows on every output, and the thumbs down that teaches them: give one with what was wrong, list the ones on a subject, Undo one, and price the redo it would run.",
      "name": "agent-learnings"
    },
    {
      "description": "The durable audit trail of a table's enrichment actions: configured, edited, run, cancelled, and settled cost.",
      "name": "table-enrichment-audit-logs"
    },
    {
      "description": "Endpoints for saving and applying column templates.",
      "name": "table-templates"
    },
    {
      "description": "Server-sent change feed for a table's grid.",
      "name": "table-events"
    },
    {
      "description": "Endpoints for org-shared saved table views: sort, filters, hidden columns.",
      "name": "table-views"
    },
    {
      "description": "Endpoints for PER-USER table preferences: favourites and recently opened. Unlike the rest of the table surface these are personal, so two members of one organisation legitimately see different answers.",
      "name": "table-user-prefs"
    },
    {
      "description": "Endpoints for building a table from an uploaded CSV: upload and preview the inferred columns, commit the reviewed mapping, then poll the row load.",
      "name": "table-imports"
    },
    {
      "description": "Endpoint for downloading a table's rows as CSV.",
      "name": "table-export"
    },
    {
      "description": "Endpoints for the integration a table imports from: attach and preview it, promote imported fields into columns, and run the import on demand.",
      "name": "table-sources"
    },
    {
      "description": "Endpoints for a table's recurring import cadence: set it, pause it, and read the next fire times.",
      "name": "table-schedules"
    },
    {
      "description": "Endpoints for pushing a table's rows out to a connected integration: list writable destinations, derive their write capabilities, and map export columns.",
      "name": "table-writeback"
    },
    {
      "description": "Endpoints backing a lookup column's setup: the connections whose records a column could read, and the identity fields one record type can be looked up by.",
      "name": "table-integration-lookup"
    },
    {
      "description": "Endpoints for sourcing leads from the lead database: count and preview matches, land them in a table, and keep saved searches. Alongside people and company searches, leads can be sourced from buying signals (what a company or person just did), with a catalogue endpoint behind the picker that builds them.",
      "name": "find-leads"
    },
    {
      "description": "Endpoints for discovering a domain's subdomains from public certificate logs and landing the results in a table.",
      "name": "find-subdomains"
    },
    {
      "description": "Endpoints for the credit balance meter and usage reporting.",
      "name": "credits"
    },
    {
      "description": "Endpoints for the workspace referral program: the shareable link, the friends who joined through it, and claiming a code after signup.",
      "name": "referral"
    },
    {
      "description": "Endpoints for the affiliate program's own dashboard: enrolling and claiming a code, the summary, stats and activity feed, the commission ledger, and identity verification and payouts.",
      "name": "affiliate"
    },
    {
      "description": "Endpoints for recording where a new workspace came from: the marketing page or campaign its signup link carried, sent once after signup.",
      "name": "attribution"
    },
    {
      "description": "Endpoints for the design partner program's customer surface: whether this workspace is a design partner, the badges its feedback has earned, and sending and reading that feedback.",
      "name": "design-partner"
    },
    {
      "description": "Endpoints for the org-level AI business context (company description, ideal customer profile, buyer personas, interest signals and social proof), plus domain-based generation and the reference documents whose summaries ride alongside those fields.",
      "name": "ai-context"
    },
    {
      "description": "Endpoints for the signed-in user's Google Drive connection: starting and finishing the OAuth grant, checking or dropping it, and minting the short-lived token the Google Picker needs.",
      "name": "google-drive"
    }
  ],
  "servers": [
    {
      "url": "https://api.getoneprofile.ai"
    }
  ]
}